前言
日常工作中索引失效原因很多,这个需要平时的日积月累,不断学习,才能更正确的发挥索引的作用,下面简单总结一些索引失效原因。

1. 隐式的类型转换,索引失效

select * from test where num=13911111111; # 失效,num字段是varchar类型,没有加引号

假设某手机号列创建时是num varchar(15)
如果上面的手机号没有加引号,查询的时候是字符串跟数字的比较,它们类型不匹配,MySQL 会做隐式的类型转换,把它们转换为浮点数再做比较。隐式的类型转换,索引会失效。

2. 查询条件包含 or,可能导致索引失效

select * from test where mul=1 or noidx=2; # 可能失效,当mul设为索引列而noidx不是索引列时

索引+or+无索引的列:会先走索引列,但无索引的列会进行全表扫描,所以还不如不走索引,直接都全表扫描完事。如果or前后都有索引,那么可能走索引,也可能不走索引。
如果它一开始就走全表扫描,直接一遍扫描就完事。Mysql 优化器出于效率与成本考虑,遇到 or 条件,让索引失效,看起来也合情合理。
用or连接的两个含null索引字段,不走索引。但是,单个索引含null字段,是走索引的。
注意:如果 or 条件的列都加了索引,索引可能会走也可能不走,平时大家使用的时候,还是要注意一下这个 or,学会用 explain 分析。遇到不走索引的时候,考虑拆开两条 SQL。

3. like 通配符可能导致索引失效
并不是用了 like 通配符,索引一定会失效,而是 like 查询是以 % 开头,才会导致索引失效。

4. 查询条件不满足联合索引的最左匹配原则
MySQl 建立联合索引时,会遵循最左前缀匹配的原则,即最左优先。如果你建立一个(a,b,c)的联合索引,相当于建立了 (a)、(a,b)、(a,b,c) 三个索引。

5. 在索引列login_time上使用 mysql 的内置函数

select * from user where DATE_ADD(login_time,INTERVAL 1 DAY) = '2022-11-08 00:00:00'; # 失效
select * from user where login_time = DATE_ADD('2022-11-08 00:00:00',INTERVAL 1 DAY); # 有效

6. 对索引列age进行列运算(如,+、-、*、/), 索引不生效

select * from user where age-1 = 39; # 失效

7. 索引字段age上使用(!= 或者 < >, not in),索引可能失效

select * from user where age != 18; # 有可能失效

其实这个也是跟 mySQL优化器有关,如果优化器觉得即使走了索引,还是需要扫描很多很多行的哈,它觉得不划算,不如直接不走索引。平时我们用!= 或者 < >,not in 的时候,要留点心眼。

8. 索引字段上使用 is null, is not null,索引可能失效 (查询结果行数)
很多时候,是因为数据量问题,导致了 MySQL 优化器放弃走索引。同时,平时我们用 explain 分析 SQL 的时候,如果 type=range, 要注意一下哈,因为这个可能因为数据量问题,导致索引无效。

9. 左右join连接,关联的字段编码格式不一样
如user 表的 name 字段编码是 utf8mb4,而 user_job 表的 name 字段编码为 utf8。

10. 索引自身失效
虽然索引有自我维护的能力,但数据表内容修改和更新频繁的情况下,也有可能索引失效,此时需要删除索引,重新建立索引。

总结
关于索引失效原因有很多,以上也只是简单介绍了一下,具体失效原因,还得去自己分析,具体方法就是SQL的执行计划 EXPLAIN 关键字了。
Mysql提供了这个关键字让我们优化索引,使查询更快,分析优化器的表连接,使它采用最优的顺序。使用这个 explain 关键字可以查看查询语句是否走索引了以及走了哪个索引。

# 命令行执行以下语句即可查看查询语句是否走了索引,在查询语句最前面加上 explain 即可
mysql> explain select * from sampleInfo where agents = "XXX中心有限公司";

如下图的 key 即表示该语句使用了索引 agents 。如果下图 key 那里的为NULL或者 type 那里为ALL,则表示该语句没有走索引,需要进行优化了。

MySQL索引失效原因,SQL查询语句不走索引原因相关推荐

  1. Mysql常规27种sql查询语句

    Mysql常规27种sql查询语句 话不多说,直接上干货 1.查询部分列 select 列名 from 表名 例:员工表中查询员工编号.名字.邮箱 select employee_id,employe ...

  2. 「MySQL」- 复杂的SQL查询语句

    任意门 前言 聚合查询 1.聚合函数 count函数 sum函数 avg函数 max函数 min函数 2.分组查询 having子句 多表查询 1.笛卡尔积 2.内连接 3.外连接 左外连接 右外连接 ...

  3. Mysql常用30种SQL查询语句优化方法

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  4. MySQL 常用30种SQL查询语句优化方法

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及 ...

  5. mysql 索引查询_mysql索引的建立和查询语句优化

    首先表内容展示: # 300W条的模拟数据 # 并且没有建立任何索引 不建立索引的查询时间: 以id查询的(4秒多): 以email查询的(4秒多): 建立主键索引后: alter table s1 ...

  6. mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...

    like百分号加前面一定不走索引吗? 正常来讲,我们都知道在mysql的like查询中,百分号加在关键词后面是走索引的,比如 select * like "张三%",而百分号在前面 ...

  7. MySQL番外篇:一条SQL查询语句是如何执行的?

    在面试的过程中,有的面试官会给出一条简单的SQL查询语句,让简单说一下执行的过程. SELECT * FROM emp where age=30; 以下问MySQL的基本架构图,从中可以看出SQL语句 ...

  8. mysql怎么查看刷脏页慢_一条SQL查询语句极为缓慢,如何去优化呢

    一条 SQL 查询语句执行的很慢,那是每次查询都很慢呢?还是大多数情况下是正常的,偶尔出现很慢呢?可以分以下两种情况来讨论. 大多数情况是正常的,只是偶尔会出现很慢的情况. 在数据量不变的情况下,这条 ...

  9. 【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的

    文章目录 1 一条SQL查询语句是如何执行的 2 mysql体系结构 3 InnoDB存储引擎 4 总结 1 一条SQL查询语句是如何执行的 ​ 通常我们使用数据库,都是将数据库看成一个整体,我们的应 ...

最新文章

  1. 发送快递:配置静态路由
  2. 联想确定造芯!全资半导体公司曝光:上海自贸区注册,数据中心VP任法人
  3. 海洋分享lol皮肤插件_LOL手游:能否火起来,梦泪测试后给出评价,网友:说的太真实了...
  4. CentOS5.8下varnish-2.1.5的安装配置
  5. boost::fusion::unfused_typed用法的测试程序
  6. InputStream 类型
  7. [js对象]JS入门之Date对象
  8. 在JupyterNotebook中使用多个Python环境
  9. MySQL安装后默认自带数据库的作用
  10. pod配置Liveness和Readiness探针
  11. 腾讯想拿到Big Data资源,8h删抓紧时间!!
  12. ThinkPHP 5.1+全开源带后台商城小程序源码程序+带详细安装使用文档
  13. 电脑文件同步备份软件哪个好用?
  14. ruby 安装bundler的方法
  15. 9.6.5对象的常引用
  16. html网页打开慢的解决方法,真实案例讲述导致网站打开速度慢的原因及解决方法...
  17. 转 Apache Ignite——新一代数据库缓存系统
  18. 智能红外遥控器(三):红外学习温湿度读取
  19. flink sql 报错:FlinkRuntimeException: Exceeded checkpoint tolerable failure threshold
  20. python grad_PyTorch中model.zero_grad()和optimizer.zero_grad()用法

热门文章

  1. 实现线性回归的梯度下降法算法,解决糖尿病预测问题,输出mse和R2的值。
  2. [论文阅读]AlphaStock:使用可以解释性的深度强化学习注意力网络的买入Winners和卖出Losers投资策略
  3. abap 针式打印机 打印连续纸 11孔纸 不能按照分割线出纸 或者出现隔一张纸的情况等
  4. python脚本实现~DNS欺骗攻击
  5. 动手用Simulink做Matlab的第一个仿真(2016a版本)
  6. 史上最简单OpenWRT教程!三分钟三步搞定!碉堡了
  7. Android 7.0支持exfat文件系统
  8. Java算法:计算π(圆周率)
  9. opencv图像处理:一、颜色空间转换
  10. 网维大师开机命令教程