MySQL索引失效原因,SQL查询语句不走索引原因
前言
日常工作中索引失效原因很多,这个需要平时的日积月累,不断学习,才能更正确的发挥索引的作用,下面简单总结一些索引失效原因。
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查询语句不走索引原因相关推荐
- Mysql常规27种sql查询语句
Mysql常规27种sql查询语句 话不多说,直接上干货 1.查询部分列 select 列名 from 表名 例:员工表中查询员工编号.名字.邮箱 select employee_id,employe ...
- 「MySQL」- 复杂的SQL查询语句
任意门 前言 聚合查询 1.聚合函数 count函数 sum函数 avg函数 max函数 min函数 2.分组查询 having子句 多表查询 1.笛卡尔积 2.内连接 3.外连接 左外连接 右外连接 ...
- Mysql常用30种SQL查询语句优化方法
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...
- MySQL 常用30种SQL查询语句优化方法
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及 ...
- mysql 索引查询_mysql索引的建立和查询语句优化
首先表内容展示: # 300W条的模拟数据 # 并且没有建立任何索引 不建立索引的查询时间: 以id查询的(4秒多): 以email查询的(4秒多): 建立主键索引后: alter table s1 ...
- mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...
like百分号加前面一定不走索引吗? 正常来讲,我们都知道在mysql的like查询中,百分号加在关键词后面是走索引的,比如 select * like "张三%",而百分号在前面 ...
- MySQL番外篇:一条SQL查询语句是如何执行的?
在面试的过程中,有的面试官会给出一条简单的SQL查询语句,让简单说一下执行的过程. SELECT * FROM emp where age=30; 以下问MySQL的基本架构图,从中可以看出SQL语句 ...
- mysql怎么查看刷脏页慢_一条SQL查询语句极为缓慢,如何去优化呢
一条 SQL 查询语句执行的很慢,那是每次查询都很慢呢?还是大多数情况下是正常的,偶尔出现很慢呢?可以分以下两种情况来讨论. 大多数情况是正常的,只是偶尔会出现很慢的情况. 在数据量不变的情况下,这条 ...
- 【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的
文章目录 1 一条SQL查询语句是如何执行的 2 mysql体系结构 3 InnoDB存储引擎 4 总结 1 一条SQL查询语句是如何执行的 通常我们使用数据库,都是将数据库看成一个整体,我们的应 ...
最新文章
- 发送快递:配置静态路由
- 联想确定造芯!全资半导体公司曝光:上海自贸区注册,数据中心VP任法人
- 海洋分享lol皮肤插件_LOL手游:能否火起来,梦泪测试后给出评价,网友:说的太真实了...
- CentOS5.8下varnish-2.1.5的安装配置
- boost::fusion::unfused_typed用法的测试程序
- InputStream 类型
- [js对象]JS入门之Date对象
- 在JupyterNotebook中使用多个Python环境
- MySQL安装后默认自带数据库的作用
- pod配置Liveness和Readiness探针
- 腾讯想拿到Big Data资源,8h删抓紧时间!!
- ThinkPHP 5.1+全开源带后台商城小程序源码程序+带详细安装使用文档
- 电脑文件同步备份软件哪个好用?
- ruby 安装bundler的方法
- 9.6.5对象的常引用
- html网页打开慢的解决方法,真实案例讲述导致网站打开速度慢的原因及解决方法...
- 转 Apache Ignite——新一代数据库缓存系统
- 智能红外遥控器(三):红外学习温湿度读取
- flink sql 报错:FlinkRuntimeException: Exceeded checkpoint tolerable failure threshold
- python grad_PyTorch中model.zero_grad()和optimizer.zero_grad()用法
热门文章
- 实现线性回归的梯度下降法算法,解决糖尿病预测问题,输出mse和R2的值。
- [论文阅读]AlphaStock:使用可以解释性的深度强化学习注意力网络的买入Winners和卖出Losers投资策略
- abap 针式打印机 打印连续纸 11孔纸 不能按照分割线出纸 或者出现隔一张纸的情况等
- python脚本实现~DNS欺骗攻击
- 动手用Simulink做Matlab的第一个仿真(2016a版本)
- 史上最简单OpenWRT教程!三分钟三步搞定!碉堡了
- Android 7.0支持exfat文件系统
- Java算法:计算π(圆周率)
- opencv图像处理:一、颜色空间转换
- 网维大师开机命令教程