10.MySQL 为什么有时候会选错索引?

206 阅读1分钟
MySQL 实战45讲

MySQL 中的一张表支持多个索引。

优化器选择索引的目的是找一个最优的执行方案并用过最少的代价去执行语句。

在数据库里面扫描行数是影响被执行代价的因素之一。

扫描行数并不是唯一的标准。优化器还会结合是否使用临时表、是否排序等因素进行判断。

MySQL 中,有两种存储索引的方式,可以通过设置参数 innodb_status_persistant 的值来选择。

设置为 on 时,表示统计信息会持久化存储。这时,默认的 N 是 20,M 是 10。

设置为 off 时,表示统计信息只存储在内存中。这时,默认的 N 是 8,M 是 16。

N:InnoDB 采样统计时选择的数据页。

M:当表变更的数据行超过 1/M 时,会自动触发,重新做一次索引统计。

使用普通索引需要把回表的代价算进去。

索引的选择和处理

1.采用 force index 强行选择一个索引。

2.修改语句,引导 MySQL 使用我们期望的索引。

3.新建一个更合适的索引来提供优化器做选择,或删除误用的索引。