18 | 为什么这些SQL语句逻辑相同,性能却差异巨大?

对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。

mysql> select count(*) from tradelog where month(t_modified)=7;

这条语句需要走全索引扫描

select * from tradelog where id + 1 = 10000

也需要走全索引扫描

隐式类型转换也可能会导致全表扫描

mysql> select * from tradelog where tradeid=110717;

tradeid 的字段类型是 varchar(32),而输入的参数却是整型,所以需要做类型转换。

两个表连表时,字符集不同就用不上索引,字符集不同时相当于如下语句:

select * from trade_detail where CONVERT(traideid USING utf8mb4)=$L2.tradeid.value;

字符集不同只是条件之一,连接过程中要求在被驱动表的索引字段上加函数操作,是直接导致对被驱动表做全表扫描的原因。

alter table trade_detail modify tradeid varchar(32) CHARACTER SET utf8mb4 default null;//这样就可以用索引

原文地址:https://www.cnblogs.com/lakeslove/p/12256865.html