关于优化器的使用
- 索引有一个基数的概念,也就是该索引上不同数值的数越多,该索引的区分度越大,基数越大.这个索引一下子能区分的数据就越多.
- 优化器查询sql执行所要扫描的索引基数,用的就是随机取样法
- 先取索引树上N页的数据,判断上面有多少基数时,再乘以多少页,就是基数
- 当索引树上的数据更新量达到1/M的时候,会重新触发一次统计基数,
- 存储索引统计的方式可以通过innodb_stats_persistent,
- 设置为on,表示统计信息会持久化存储,N是20,M是10
- 设置为off,表示统计信息会保存在内存中,N是8,M是16
- 有时候优化会选择全文检索10w条数据,也不愿选择3w条普通索引,原因是优化器把普通索引的回表操作也计算进这损耗里面,所以有时候优化器会选择错索引的一部分原因就是基数的计算不准确,还有索引评估错误
关于优化器的优化
- 基数的计算不准确,可以使用analyze table来解决(索引空洞过多,导致基数计算不准确)
- 如果是索引选择错误
- 可以使用force index来强行指定走哪个索引
- 也可以使用改造语句来让优化器来选择索引