MySQL实战第九篇

118 阅读1分钟

为什么这些SQL语句逻辑相同,性能差距却很大?

条件字段函数操作

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

img

传入 7 的时候,在树的第一层就不知道该怎么办了。

隐式转换类型

当我们的tradeid是varchar类型时,走下面的SQL语句

mysql> select * from tradelog where tradeid=110717;

就相当于走了

mysql> select * from tradelog where CAST(tradid AS signed int) = 110717;

隐式字符编码转换

当有需要用到多表查询时,我们通过表A的a字段去查询表B中相对的a字段时,需要注意两张表中的字段a的字符集是否一致,若不一致则会出发字符转换函数导致全表扫描。SQL语句如下:

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

结论:对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。索引字段不能进行函数操作,但是索引字段的参数可以玩函数。