为什么你的sql性能这么差?
我们都知道有些情况下是不会走索引的所以性能会比较差,但是你知道为啥这些情况不走索引吗?下面我们一一看一下为啥他性能这么差。
条件字段函数操作
为什么对字段做了函数计算,就用不上索引了?我们首先想一下为什么索引具有快速定位的能力,索引之所以能够快速定位,是因为索引维护了一个顺序,对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。 举个栗子🌰 select * from t where created ='2020-08-26'
假设在created上创建了索引,MySQL可以根据索引的顺序快速定位到,如果是这么写的话就不行了select * from t where month(created)=7
,因为MySQL不可能将created转换成月份然后在排序,所以优化器选择不走索引。
隐式类型转换
假设我们有一个varchar类型的字段,我们在写where条件时写的是int,此时我们用explain可以看到走的是全表扫描,那这是为什么呢?
select * from t where test=1234;
其中test是varchar类型,其实这个语句等价于select * from t where CAST(test AS signed int) = 1234;
所以你现在知道为啥不会走索引了吧。
隐式字符编码转换
假设我们有一条sqlselect t2.* from t1, t2 where t1.id= t2.t1_id and t2.id=2;
其中t1,和t2的id都是主键自然都是有索引的,但是用explain发现 这个分了两步, t2.id=2这步使用了索引,第二步根据t2.id=2查出来的内容去匹配t1的时候却没有走索引?那是为什么呢?其实是因为t1 和t2 两张表用的不是同一种字符集,如果一个是utf8一个是utf8mb4,里面隐含了一个CONVERT()函数,在这里的意思是把输入的字符串转成utf8mb4字符集。所以不走索引。
网友评论