同样的sql ,在不同的数据库上,执行效率不一致
现象:
mysql版本5.7
数据库引擎 innoDB
两个数据库表结构完全一致、索引一致
数据量有稍微不同
大致sql:
select B.code from A h LEFT JOIN B on B.fk_id=A.id ;
走索引的数据情况
A表的数据为4w条
B表的数据为23条
查询时间0.3秒
不走索引的数据情况
A表的数据为4w条
B表的数据为5条
查询时间13秒
A表 id 为主键索引
B表为 fk_id 普通索引
EXPLAIN select B.code from A h LEFT JOIN B on B.fk_id=A.id ;
执行一看,“B表数据为5条” 的数据库 竟然不走索引!!
原来数量量小,还会影响查询速度,使查询速度变慢!!!
做为小白的我,立即查了下资料
原来是mysql执行分析器搞的鬼,mysql 用的是CBO优化器,优化器分析出来的结果,不走索引成本更低,所以没有走索引,最终结果出乎意料。
为了验证是否是成本计算产生的问题,对 “B表数据为5条” 的数据库对应的表 insert 了18条数据,再查询,立即秒出 0.3秒
果然算法才是精髓啊,不好的算法只会坑爹~~
参考文章: