文章目录
一、新名词
1. 索引的“区分度”
- 一个索引上不同的值越多,这个索引的区分度就越好。
- 基数越大,索引的区分度越好。
2. “基数”(cardinality)
索引上不同的值的个数。
二、新指令
1. show index
show index from t;
可以查看一个索引的基数等信息。
2. analyze table
analyze table t;
可以用来重新统计索引信息。
3. force index
select * from t force index(a) where a between 10000 and 20000;
可以用来重新统计索引信息。
三、新参数
1. innodb_stats_persistent
存储索引统计的方式
- 设置为on的时候,表示统计信息会持久化存储。这时,默认的N是20,M是10。
- 设置为off的时候,表示统计信息只存储在内存中。这时,默认的N是8,M是16。
四、新知识点
- 索引扫描行数的判断:根据统计信息来估算记录数。统计信息就是索引的“区分度”。
- MySQL 得到索引基数的方法:采样统计。
五、小结
索引选择异常和处理
- 采用force index强行选择一个索引。
- 修改语句,引导MySQL使用我们期望的索引。
- 在有些场景下,可以新建一个更合适的索引,来提供给优化器做选择,或删掉误用的索引。