MySQL45讲之优化器选错索引
2021/9/11 2:04:59
本文主要是介绍MySQL45讲之优化器选错索引,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
本文简要介绍优化器选择索引的依据有哪些,有什么办法人为引导优化器选择更优的执行方案。
为什么会出现选错索引
可能是统计索引基数信息错误,导致优化器错选索引,也可能是MySQL
的bug
。
选择依据
优化器选择索引的依据有扫描行记录数、回表次数、是否创建临时表和是否排序。
索引扫描行数。通过取样的方式统计索引列上不同的值数量,取N
张数据页,统计页面上不同值的数量,然后估算总的不同数量(基数cardinality
),这也称之为索引的“区分度”。可以通过SHOW INDEX FROM table_name
来查看每个索引的基数。
对于这条执行语句 SELECT * FROM t WHERE a BETWEEN (1, 10000) AND b BETWEEN (50000, 100000) ORDER BY b LIMIT 1
,从扫描行数上考虑,应该选择a
上的索引,但通过MySQL
执行计划发现,实际选择了b
索引。因为优化器考虑了需要根据b
排序,选择b
索引扫描获取记录可以避免再排序。但是,使用a
索引的查询耗时远比使用b
索引耗时低。
如何避免选错索引
1、强制使用索引
使用force Index(a)
强制SQL
执行时采用某个索引,比如SELECT * FROM t force Index(a) WHERE a BETWEEN (1, 10000) AND b BETWEEN (50000, 100000) ORDER BY b LIMIT 1
。
2、重新计算基数
因为MySQL
取样估计基数可能存在比较大的误差,导致优化器选择低效的执行方案。为了避免这个统计信息的问题,可以使用Analyze TABLE t
来重新统计信息。
3、选择更合适的索引或者删除误用的索引
这篇关于MySQL45讲之优化器选错索引的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15MySQL教程:初学者必备的MySQL数据库入门指南
- 2024-11-15MySQL教程:初学者必看的MySQL入门指南
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程
- 2024-11-01部署MySQL集群学习:新手入门教程
- 2024-11-01部署MySQL集群入门:新手必读指南