本文章假设读者已了解mysql的索引基础知识,如b+树,聚集索引,并对explain分析结果已了解。以下主要分析mysql的索引选择原理及算法。
Mysql InnoDB的查询一般基于explian所获取的最小rows来选择使用哪一个索引。Rows是一个estimate的值,其估计算法(规则)如下:
1.如果是select c from where a=***,a上有索引。Mysql大概率会使用a上的索引。其rows计算规则为Rows = ((Records_PLeft + Records_P1 + Records_P2 + ... + Records_P8 + Records_PRight)/10)*Page_Num。
每一页的page_size可以通过innodb_index_stats表里的stat_name字段的n_diff_pfx0?和size估算出。如果n_diff_pfx0?为1000000,size为2000,则每页存储500。如果a对应的记录数在500*10=5000内,则此explian获得的rows基本上比较精确,即通过10页的采样全部获取。如果a对应的记录数在5000以上,则rows不准确。参见https://lists.mysql.com/commits/115810,https://www.cnb