T O P

[资源分享]     MySQL45讲之优化器选错索引

  • By - 楼主

  • 2021-09-11 00:00:01
  • 前言

    本文简要介绍优化器选择索引的依据有哪些,有什么办法人为引导优化器选择更优的执行方案。

    为什么会出现选错索引

    可能是统计索引基数信息错误,导致优化器错选索引,也可能是MySQLbug

    选择依据

    优化器选择索引的依据有扫描行记录数、回表次数、是否创建临时表和是否排序。

    索引扫描行数。通过取样的方式统计索引列上不同的值数量,取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、选择更合适的索引或者删除误用的索引

    本帖子中包含资源

    您需要 登录 才可以下载,没有帐号?立即注册