【Mysql】索引哪些情况会失效

索引失效场景

当使用索引列进行查询时,最终会到主键索引树查询对应的数据进行返回,理论上来说使用了索引列查询,能很好的提高查询效率,但是不规范的使用,会使索引失效。

1. 索引列使用函数

在索引列上做运算,比如使用函数,会导致mysql无法识别索引列,查询的时候就不会走索引了。不过mysql8开始,增加了索引函数来解决这个问题。

2. 不按照组合索引的顺序查询

在一个由多列构成的组合索引中,按照最左匹配原则,从索引的最左列开始顺序检索,否则不走索引。

在组合索引中,索引的存储结构是按照索引的顺序来存储的,因此在sql中也需要按照这个顺序来进行匹配,否则InnoDB无法识别索引导致索引失效。

有个特殊情况,比如表table中存在a,b两个列的组合索引,在查询时使用where b=1 and a=1进行查询时,虽然没有按照a,b的顺序进行查询,但是还是会走索引。MySQL的查询优化器会尝试找到最有效的索引使用方式。因此,即使你的查询条件是 where b=1 and a=1,MySQL仍然可以使用 (a, b) 索引来加速查询。

3. 隐式转换不走索引

当存在隐式转换的时候,比如索引列是字符串类型,但是查询的时候没有使用引号,mysql会自动进行类型转换,导致索引失效。

4. 在索引列使用!= 或者 not的时候

在索引列使用不等于号、not查询的时候,由于索引检索的效率会非常低,因此mysql引擎判断不走索引。

5. like通配符匹配后缀%xxx

索引列使用like通配符匹配后缀%XX的时候,由于不符合索引的最左匹配原则,所以也不走索引。但是反过来,如果通配符匹配的是前缀XXX%,符合最左匹配原则,则是走索引的。

6. 使用or连接查询的时候

在使用or查询的时候,如果or语句前后没有同时使用索引,那边索引也会失效。只有当or语句前后列都是索引列的时候,索引才会生效。

除了这些场景之外,对于多表连接查询的情况,连接顺序也会影响索引的使用。

索引不适合哪些场景

1. 数据量少的情况不适合建立索引

2. 更新非常频繁的情况不适合添加索引

3. 区分度低的列不适合添加索引(比如性别等)

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值