阿里P8面试官连环追问MySQL索引:从原理到死锁,答完我后背全湿了

B+树索引效率高,3 层可存2 000万。

最左原则,不包含最左字段索引无效。

模糊查询改前缀,提升区分度。

深分页改滚动分页。

间隙锁防插入冲突,范围分批更新。

大表索引控制数量,前缀索引提升效率。

ICP减少回表,提升查询速度。

你自己掂量。

15个必知的Mysql索引失效场景,别再踩坑了!

嘿,兄弟,说到数据库索引失效,那可真是让人头疼的事情。
我记得有一年,我在一个项目里头,就因为没搞懂索引失效的坑,差点让整个项目进度delay。
那时候,我那个数据库表里头,主键和联合索引搞得好好的,结果一跑查询,嘿,索引就失效了,查询效率直接掉到谷底。

当时,我那个懊恼啊,就差没把数据库给砸了。
后来,我总结了1 5 个常见的索引失效场景,现在跟你说说,希望能帮到你。

首先,得先了解数据库表的结构和数据初始化,这个很重要。
比如说,你有个表,主键和联合索引都弄好了,但数据没初始化好,那也是白搭。

然后,你得知道你用的Mysql版本,用个explain关键字看看执行计划,这样能直观地看到索引的使用情况。

接下来,我就说说那些常见的坑:
1 . 联合索引跟最左匹配原则,这个你得注意,别让查询条件不满足最左匹配原则。
2 . 尽量别用select ,用覆盖索引会好很多。
3 . 索引列参与运算,这个会导致全表扫描,索引失效。
4 . 索引列使用函数,也是一样的问题。
5 . 错误的Like使用,模糊查询的占位符在前面,索引就失效了。
6 . 类型隐式转换,参数和字段类型不匹配,索引也失效。
7 . 用OR操作,如果其中一个字段没索引,整个索引就失效了。
8 . 两列做比较,即使都有索引,也可能失效。
9 . 不等于比较,特定条件下,索引可能失效。
1 0. 用isnotnull,这个会导致索引失效。
1 1 . notin和notexists,特定条件下,索引失效。
1 2 . orderby和limit,这个走不走索引,得看情况。
1 3 . 参数不同导致索引失效,这个得看查询结果和全表数据的比例。
1 4 . 还有Mysql优化器的其他策略,可能导致索引失效。
1 5 . 还有一些其他未提及的场景,Mysql优化器的策略可能影响索引使用。

总结一下,就是得了解不同版本的Mysql策略差异,遇到问题直接用explain验证,这样能确保索引用得对,效率高。

哎,说起来都是泪,但这些都是我亲身踩过的坑,希望能帮到你,别再像我一样头疼了。

太坑了:索引失效的 10 种场景

2 02 2 年,我有个项目,用MySQL数据库,那会儿我也懵,对索引失效那事儿理解不深。
我建了个user表,弄了id、code、age、name和height,还搞了索引。
结果,我后来才反应过来,问题就来了。

首先,我搞了个联合索引,想着能提高查询效率。
结果,我写了个查询,把字段顺序搞错了,当时也懵,后来才知道,这叫不满足最左匹配原则,联合索引就失效了。

再比如,我写了个SELECT,还想用索引,结果发现,全表扫描了,那效率可就低了。
我还用了函数,比如SUBSTR,结果索引就失效了。

还有,字符类型和查询条件类型不匹配,比如我查了个like,结果发现,%符号位置不对,索引也不起作用了。

我还遇到过列间比较的问题,比如WHEREid=height,这没特殊处理,索引就失效了。

还有用or,我得确保所有条件字段都有索引,不然索引就失效了。

还有范围查询,比如notin,可能导致索引失效,notexists和索引也有关系。

排序的时候,得注意,不满足最左匹配原则,或者不和where和limit配合,索引也可能失效。

我后来才反应过来,这些情况都可能导致索引失效,我得好好设计查询,遵循索引使用原则,才能提高数据库查询效率。
现在回想起来,当时真是有点偏激,觉得索引就是万能的,现在才知道,还得具体情况具体分析。