mysql什么情况下设置了索引但无法使用
今天面试被问及到了mysql索引问题,答得不全面。网上搜了一些资料,在这里总结记录一下。
MySQL无法命中索引的情况
1、条件中有or。
我们可以通过EXPLAIN SELECT * FROM ……语句来看一下查询过程中是否使用到的索引,如下图所示。
【注意】要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。如果出现OR的一个条件没有索引时,建议使用 union ,拼接多个查询语句。
2、like查询是以%开头,索引不会命中
只有一种情况下,只查询索引列,才会用到索引,但是这种情况下跟是否使用%没有关系的,因为查询索引列的时候本身就用到了索引。如下图所示
3、字符串类型不使用引号
如果列类型是字符串类型,那一定要在条件中将数据用引号包裹起来,否则不使用索引。
4、在索引列上使用函数(+,-,*,/)
这种情况需要使用索引,需建立函数索引。
5、采用not in,not exist
采用not in,not exist不走索引
6、B-tree索引
B-tree索引is null不会走,is not null 会走
7、编码不同
链表时,如果关联字段的编码不同,不会走索引。如一个表是utf8,另一个表是utf8mb4