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

  • 以%开头的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前面的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值