前几天面试被问到索引失效的情况,一下子没反应过来。八股文试我更能忽悠,从新整理一下。
七种情况
**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版权协议,转载请附上原文出处链接和本声明。