MySQL索引失效情况及原理

前几天面试被问到索引失效的情况,一下子没反应过来。八股文试我更能忽悠,从新整理一下。

七种情况

**1、使用or,not,<>,!= **

要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

SELECT *FROM user WHERE id = 1 or name = 'zz';

2、like查询开头是%

SELECT *FROM user WHERE name like '%zz';

3、存在隐式的类型转换

如varchar不加单引号的话可能会自动转换为int型

SELECT *FROM user WHERE name = 1;

4、复合索引,如果不使用前列,后续列也将无法使用

假设有复合索引(name,phone),不使用name的情况下,phone条件无法走索引

SELECT *FROM user WHERE phone = '111';

5、where 子句里对索引列上有数学运算,用不上索引

SELECT *FROM user WHERE id + 1 = 0;

6、where 子句里对有索引列使用函数,用不上索引

SELECT *FROM user WHERE abs(id) = 1;

7、全表扫描更快(数据少)的情况



理解原理

MySQL InnoDB的索引使用的是B+Tree这样的一个数据结构,索引失效的情况就是无法通过B+Tree找到数据。如果你觉得有所困惑,可以先学习下B+Tree,再回头看一下子就懂了。


小广告

平时中午吃饭点外卖的话可以关注下公号:饭团君外卖 。无任何套路,每天都可以省几块


版权声明:本文为qq_32475739原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。