Mysql不会使用索引的几种情况

有同学问:

explain select * from T where ifnull(id > 1002,0) > 0;

在这里插入图片描述
这个sql为什么不会使用索引?另外的同学说,这是因为优化器发现使用了函数,放弃了使用索引。从我的理解,我认为这句话有问题。

(本文章基于InnoDB引擎,即索引数据结构为B+树。如果不清楚B+树,请移步忘掉所知,重新学习MySql

要想知道不会使用索引的原因,就一定要对索引树的结构有了解。
通过对B+树的了解,不会使用索引的情况有以下几种:

1. 如果条件中有or,即使其中有条件带索引也不会使用索引,除非所有与or关联的索引都有索引链接。

这个情况需要从逻辑语义理解,and与or的区别在于,两个and之间的条件是“且”的关系,也就是说,两个条件之间,可以先判断一个条件,在判断另一个条件,二者之间是有先后顺序的;而or的逻辑语义是“或”,多个条件需要一同查询,所以,or语句条件是必须每一个条件都需要有索引才会使用索引。
eg:

 select * from t from a=1 or b=2;

上面的例子必须,a、b都具有索引才可以使用索引,而且,a与b必须都有自己独立的索引才可,诸如:a与b的联合索引是无法满足使用索引的条件的。因为本质上,用or链接的两个条件,是两个独立的条件联合形成的一个整体的条件。

2. 最左前缀原则

最左前缀原则分为两部分:

  • 一种强调联合索引中,条件满足顺序应该由左到右。
  • 另一种强调,模糊查询中,模糊部位为右部时才能使用索引。

3. 使用计算函数时不会使用索引

由于B+ 树提供的快速定位能力,来源于同一层兄弟节点的有序性。但是当对条件数据进行运算时,原条件可能会发生变化,因此优化器会放弃使用树搜索功能,但是优化器理论上并没有放弃使用索引,发现使用函数之后,优化器会对主键索引和普通索引进行判断,判断哪一个索引的更加快捷,来选择到底对于哪一个索引进行遍历。
需要注意的是,当条件格式需要隐式转换的时候也不会使用索引。
eg:

select * from t where user_id = 123;

如果此时user_id是字符型,那就会发生隐式转换。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值