MySQL索引失效

简要

在我们常规做数据库开发时,都会为每个表设置适合它的索引来加快数据库的搜索效率。

但有了索引也不是说就万事大吉,所有查询都没问题。像我们使用

但也可能因为你使用错误的SQL语句而无法使用。其中有以下几种,在使用sql查询时尽量避免。

使用!=或<>导致索引失效

select * from user where name <> '张三疯';

使用模糊查询的索引失效

最左侧不使用%时也会使用索引(最左匹配),否则不使用索引。

select * from user where name like '%疯%';

使用not in 或 not exists的索引失效

select * from user where name not in ('张三疯');

使用is null 或 is not null 的索引失效

select * from user where name is not null;

使用函数导致的索引失效

select * from user where date(create_time) = '2021-04-27';

使用类型不一致的索引失效

查询条件类型与字段类型不相符时,如下边例子,字段是字符串类型条件使用数值类型。

select * from user where name > 18;

运算符导致的索引失效

包括(+、-、*、/)都会导致索引失效

select * from user where age + 2 = 18;

or引起的索引失效

or导致索引失效是在特定情况下,并不是所有的or都会导致索引失效,如果or连接的是一个字段,那么就不会失效,反之索引失效。

select * from user where name = '张三疯' or age > 18;

MySQL查询优化器最终选择不走索引

即使完全符合索引生效的场景,考虑到实际数据量等原因,最终是否使用索引还要看MySQL优化器的判断。当然你也可以在sql语句中写明强制走某个索引。

索引本身失效

这种情况概率极低,我也只遇到过一回,确定where条件使用了索引也执行了查询,但返回的数据结果与实际不相符。未能找到原因,后来只是把这个索引删除后重建就正常了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值