mysql不走索引的SQL语句

需要明确的是,MySQL 索引失败的情况只有少数,但有多种方法可以处理它。

我们先来说最重要的两点:使用函数或表达式对列进行索引,以及隐式类型转换。
去年我们跑的一个电商项目曾经因为某个查询使用了一个函数来分割价格字段而陷入困境。
用行话来说,这称为雪崩效应。
事实上,前面的一点延迟就让一切都落后了。
第二点是类型匹配。
例如,如果一个INT字段直接与字符串进行比较,MySQL会先转换类型,然后再检查,但转换过程中索引会被白白使用——我们当时改用显式类型转换,滞后立刻消失了。

一开始我以为前导通配符问题不大,后来发现不对。
当数据量超过3 000条时,性能差异真的很可怕。
还有一个主要细节。
例如,如果 OR 条件之一有索引,而另一个没有索引,优化器将直接跳过索引。
去年的一个项目中,OR被改写为UNIONALL,查询速度提升了一倍。

等等,还有一件事要提醒您:不要盲目使用复合索引。
比如对于(A,B,C)的索引,如果直接查B,索引就白创建了——很多人都没有注意这一点。
应特别注意数据量较小的表需要给予。
对数百行数据运行索引可能不如全表扫描,老实说这非常令人沮丧。

最后,在编写 SQL 时,请记住为索引列留下一个“干净”的环境,不要让函数、计算或类型转换弄乱它。
对于复杂的查询,值得尝试拆分、重写或调整索引设计。

不要再问我 in,exists 走不走索引了...

这是一个陷阱。
不要相信“IN”和“EXISTS”不会被索引。
不要这样做,尝试在不同的场景中使用索引。