当前位置: 首页 > news >正文

Mysql为什么有时候会选错索引

案例

正常情况

有一个表t ( id, a , b ),id是主键索引,a是Normal索引。

正常情况下,针对a进行查询,可以走索引a
在这里插入图片描述
并且查询的数量和预估扫描行数是差不多的,都是10001行
在这里插入图片描述

奇怪的现象

随着时间的变化,后面可能就会发生下面的情况
在这里插入图片描述
根据explain计划,我们发现数据还是那么多,但是不走a索引了,并且优化器知道有a索引,但是最终还是走了全表扫描。

优化器的逻辑

先了解一下优化器
选择索引是优化器的工作,而优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。在数据库里面,扫描行数是影响执行代价的因素之一。扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少(扫描行数并不是唯一的判断标准,优化器还会结合是否使用临时表、是否排序等因素进行综合判断)

下面只讨论扫描行数带来的影响
那么优化器是怎么去估算需要扫描多少行?
在这里插入图片描述
我们可以通过命令看到有一个Cardinality(基数),选择索引需要扫描的行数就是通过它来判断的,它代表一个索引上不同的值的个数,值越大说明区分度越高,那么越有可能走这个索引

优化器的选择一定对么?

上面看到针对下面这个sql,优化器觉得全表扫描更合适,但实际上真的是速度最快的么?

select * from t where a between 10000 and 20000;

我们实际执行一下:
在这里插入图片描述
不接受优化器的建议,强行走a索引执行一下:
在这里插入图片描述
重点看3个指标:Query_time(执行耗时)、Rows_sent(返回行数)、Rows_examined(扫描/行数)
我们发现强行走索引a其实更快,实际扫描行数也少。那么为什么优化器不走索引a呢?

我们再执行一个命令(更新表的统计信息):

ANALYZE TABLE t;

然后我们再看一下执行计划:

explain select * from t where a between 10000 and 20000;

在这里插入图片描述
发现优化器竟然又选择了索引a,说明是因为统计信息不准确,没有及时更新导致优化器进行了错误的选择。
接着实际执行一下:

select * from t where a between 10000 and 20000;

在这里插入图片描述
我们发现实际的扫描行数和预估的扫描行数对上了,并且也确实走了索引a,耗时也降下来了
最后我们再看一下索引的统计信息
在这里插入图片描述
统计信息确实和上面不一样了,更新了。但是这里有个问题是:虽然统计信息不一样了(能确保确实更新索引统计信息的sql起作用了)但统计信息和一开始也差不多,为什么Cardinality值差不多的情况下,优化器做出了不一样的选择?
因为实际上表数据经历了大量的删除、新增操作,Cardinality不会更新一些还未提交的事务数据,所以看似基数差不多,实际上基数不一样优化器对主键的判断是基于实际表行数来判断的,所以主键的判断是准的,不准的是其他索引的统计信息。

总结

本文讨论了Mysql(InnoDB)在索引统计信息不准确或更新不及时的情况下,优化器基于统计信息进行粗估的执行计划,可能会选错索引。
我们一般应对的方法如下:

  1. 更新索引统计信息
  2. 修改SQL语句强制走固定索引
  3. 新增索引(比如上面新增一个索引a,b)
  4. 删除索引(假设优化器选择了索引b,确保该索引没有其他作用的前提下,那么删掉索引b,可能就会走索引a了)

相关文章:

  • IE之路专题10.OSFP专题
  • python操作mongodb
  • 论文阅读:Invertible Grayscale
  • 【maxENT】最大熵模型(Maximum Entropy Model)介绍与使用(maxENT软件)
  • Python基础语法速通(自用笔记)
  • 01新手村
  • QML布局关于【Row】和【RowLayout】有何异同
  • 游戏引擎学习第223天
  • 解读数据集成建模中的数据模型
  • 蓝桥赛前复习2:一维差分二维差分
  • 讲解贪心算法
  • 顶刊【遥感舰船目标检测】【TGRS】CM-YOLO:基于上下文调制表征学习的船舶检测方法
  • 基于 GoFrame 框架的电子邮件发送实践:优势、特色与经验分享
  • React Redux
  • Docker简介,快速入门
  • OSPF+MGRE的配置练习
  • 1.29G 雨晨 19044.5737 Windows 10 IoT 企业版 LTSC x64 极速版 VIP 7天有效开放体验
  • GPT - 多头注意力机制(Multi-Head Attention)模块
  • AI应用开发平台 和 通用自动化工作流工具 的详细对比,涵盖定义、核心功能、典型工具、适用场景及优缺点分析
  • CTF web入门之文件包含
  • 网红街区如厕难,如何多管齐下补缺口?
  • 鄂州:锁死中小学教师编制总量,核减小学编制五百名增至初中
  • 综艺还有怎样的新可能?挖掘小众文化领域
  • 雷军:过去一个多月是创办小米以来最艰难的时间
  • 伤员回归新援融入,海港逆转海牛重回争冠集团
  • 长期对组织隐瞒真实年龄,广元市城发集团原董事韩治成被双开