mysql 查询时的优化

查看 94|回复 9
作者:dust0522   
为什么有时候用了 join 比没用 join 的还快,MySQL 做了什么优化
register InnoDB 16w 数据 mer_no 有索引 mcc_cd 没索引
mccs MyISAM 300 条数据 code 没索引
-- 0.25 秒以上
SELECT * FROM register WHERE mer_no = '10373914029XXXXXXXXX' limit 1
-- 0.18 秒
SELECT * FROM register mr LEFT JOIN mccs mc ON mc.code = mr.mcc_cd WHERE mr.mer_no = '10373914029XXXXXXXXX' limit 1

register, join, 索引

dust0522
OP
  
register InnoDB 16w 数据 mer_no 有索引
mcc_cd 没索引 mccs MyISAM 300 条数据 code 没索引
-- 0.25 秒以上 SELECT * FROM register WHERE mer_no = '10373914029XXXXXXXXX' limit 1
-- 0.18 秒 SELECT * FROM register mr LEFT JOIN mccs mc ON mc.code = mr.mcc_cd WHERE mr.mer_no = '10373914029XXXXXXXXX' limit 1
dust0522
OP
  
表:register InnoDB 16w 条数据 mer_no 有索引 、mcc_cd 没索引
表:mccs MyISAM 300 条数据 code 没索引
-- 0.25 秒以上
SELECT * FROM register WHERE mer_no = '10373914029XXXXXXXXX' limit 1
-- 0.18 秒
SELECT * FROM register mr LEFT JOIN mccs mc ON mc.code = mr.mcc_cd WHERE mr.mer_no = '10373914029XXXXXXXXX' limit 1
weijancc   
mer_no 有索引那应该是第一条查询更快才对, 会不会是网络问题呢
Braisdom   
这难道不是 MySQL 的 Bug 吗?
opengps   
0.18 与 0.25 似乎没啥可比性,有没有更显著的数字展示下?查询提速能考虑的无非就是索引合理性
opengps   
重启下 mysql 服务,只记录首次查询语句耗时(释放掉索引的缓存,排除下这个因素)
xsonglive491   
你直接 explain format='json' 一下看看怎么回事就好了,可以看到查询的顺序
rekulas   
索引列 limit 1 百毫秒级,索引已经出问题了,别纠结快慢问题了,删除索引重建吧。。。
BiChengfei   
用的 navicat 吗,单位秒太大了,不容易分析,看看有没有毫秒的时间显示,我觉得有可能是缓存导致的,使用 select sql_no_cache xxx 试试,还是不行的话,用 shell 客户端试试
个人分析,经过 MySQL 查询优化器的处理,第一种直接回表 register 查询出来,第二种需要先 register 回表,再去 join mccs 表,路径长了一步,所以第一种绝对快。第二种应该是用了第一种的缓存,再加上 json mccs 表,因为 mccs 表数据很少,所以比第一种快了一点
您需要登录后才可以回帖 登录 | 立即注册

返回顶部