存在索引但不能使用索引的典型场景

  • 以%开头的like查询不能够利用B-Tree索引

select * from actor where last_name like '%NI%'

因为B-Tree索引的结构,所以以%开头的查询很自然就没法利用索引了,一般都推荐使用全文索引(Fulltext)来解决类似的全文检索问题,或者考虑利用InnoDB的表都是聚簇表的特点,采取一种轻量级别的解决方式:一般情况下,索引都会比表小,扫描索引要比扫描表更快(某些特殊情况下,索引比表大,不在讨论范围之内),而InnoDB表上的二级索引idx_last_name实际上存储字段last_name还有主键actor_id,那么理想的访问方式应该是首先扫描二级索引idx_last_name获得满足条件last_name like '%NI%'的主键actor_id列表,之后根据主键回表去检索记录,这样访问避开了全表扫描actor表产生的大量IO请求。

  • 数据类型出现隐式转换的时候也不会使用索引,特别是当列类型是字符串,那么一定记得在where条件中把字符常量值用引号引起来,否则即便这个列上有索引,MySQL也不会用到。

select * from dept where dept_id = 900198

修改为:select * from dept where dept_id = '900198'

  • 复合索引的情况下,假如查询条件不包含索引列最左边部分,即不满足左走原则,是不会使用复合索引的。
  • 如果MySQL 估计使用索引比全表扫描慢,则不使用索引。

注意:在查询的时候,筛选性越高越容易使用到索引,筛选性越低越不容易使用索引。

  • 用or分割开的条件,如果or前面的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

 

你可能感兴趣的:(存在索引但不能使用索引的典型场景)