分析表gydF4y2Ba
复杂性为gydF4y2BaInnoDBgydF4y2Ba
表依赖于:gydF4y2Ba
的页面数量取样,所定义的gydF4y2Ba
innodb_stats_persistent_sample_pagesgydF4y2Ba
。gydF4y2Ba索引表中的列的数量gydF4y2Ba
分区的数量。如果一个表没有分区,分区的数量被认为是1。gydF4y2Ba
使用这些参数估计的近似公式gydF4y2Ba分析表gydF4y2Ba
复杂性是:gydF4y2Ba
的价值gydF4y2Bainnodb_stats_persistent_sample_pagesgydF4y2Ba
*一个表的索引列数量*分区的数量gydF4y2Ba
通常情况下,得到的值越大,越大的执行时间gydF4y2Ba分析表gydF4y2Ba
。gydF4y2Ba
innodb_stats_persistent_sample_pagesgydF4y2Ba
定义的页面数量在全球层面上采样。设置采样的页面数量为一个单独的表,使用gydF4y2BaSTATS_SAMPLE_PAGESgydF4y2Ba
选项gydF4y2Ba创建表gydF4y2Ba
或gydF4y2BaALTER TABLEgydF4y2Ba
。有关更多信息,请参见gydF4y2Ba部分15.8.10.1”,持续优化配置统计参数”gydF4y2Ba。gydF4y2Ba
如果gydF4y2Bainnodb_stats_persistent =了gydF4y2Ba
,页面的数量被定义为采样gydF4y2Bainnodb_stats_transient_sample_pagesgydF4y2Ba
。看到gydF4y2Ba部分15.8.10.2”,非持久性配置优化统计参数”gydF4y2Ba额外的信息。gydF4y2Ba
更深入的评估方法gydF4y2Ba分析表gydF4y2Ba
复杂性,考虑下面的例子。gydF4y2Ba
在gydF4y2Ba大O符号gydF4y2Ba,gydF4y2Ba分析表gydF4y2Ba
复杂性被描述为:gydF4y2Ba
O (n_sample * (n_cols_in_uniq_i + n_cols_in_non_uniq_i + n_cols_in_pk * (1 + n_non_uniq_i)) * n_part)gydF4y2Ba
地点:gydF4y2Ba
n_samplegydF4y2Ba
是采样的页数(定义为gydF4y2Bainnodb_stats_persistent_sample_pagesgydF4y2Ba
)gydF4y2Ban_cols_in_uniq_igydF4y2Ba
在所有独特的索引所有列的总数(不包括主键列)gydF4y2Ban_cols_in_non_uniq_igydF4y2Ba
所有列的总数在所有nonunique索引gydF4y2Ban_cols_in_pkgydF4y2Ba
是主键的列数(如果没有定义一个主键,gydF4y2BaInnoDBgydF4y2Ba
在内部创建一个列主键)gydF4y2Ban_non_uniq_igydF4y2Ba
nonunique索引的表的数量吗gydF4y2Ban_partgydF4y2Ba
分区的数量。如果没有定义,分区表被认为是一个单独的分区。gydF4y2Ba
现在,考虑下面的表(表gydF4y2BatgydF4y2Ba
(2),它有一个主键列),唯一的索引(2列),和两个nonunique索引(每两列):gydF4y2Ba
创建表t (INT, INT, INT, INT, INT, INT, INT, INT,主键(a、b),唯一键i1uniq (c, d),关键i2nonuniq (e, f),关键i3nonuniq (g, h));gydF4y2Ba
列和索引数据所需的算法上面描述,查询gydF4y2Bamysql.innodb_index_statsgydF4y2Ba
持久的索引统计数据表的表gydF4y2BatgydF4y2Ba
。的gydF4y2Ban_diff_pfx %gydF4y2Ba
统计数据显示的列数为每个索引。例如,列gydF4y2Ba一个gydF4y2Ba
和gydF4y2BabgydF4y2Ba
计算的主键索引。对于nonunique索引,主键列(a, b)计算除了用户定义的列。gydF4y2Ba
提供更多的信息gydF4y2BaInnoDBgydF4y2Ba
持久数据表,请参阅gydF4y2Ba部分15.8.10.1”,持续优化配置统计参数”gydF4y2Ba
mysql >选择index_name、stat_name stat_description从mysql。innodb_index_stats database_name =“测试”,table_name = ' t '和stat_name像“n_diff_pfx %”;+ - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | index_name | stat_name | stat_description | + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -主要+ | | n_diff_pfx01 |的| | |主要n_diff_pfx02 | a, b | | i1uniq | n_diff_pfx01 c | | | i1uniq | n_diff_pfx02 | c, d | | i2nonuniq | n_diff_pfx01 e | | | i2nonuniq | n_diff_pfx02 | e, f | | i2nonuniq | n_diff_pfx03 | e, f,一个| | i2nonuniq | n_diff_pfx04 | e, f, a, b | | i3nonuniq | n_diff_pfx01 g | | | i3nonuniq | n_diff_pfx02 | g h | | i3nonuniq | n_diff_pfx03 | g h,一个| | i3nonuniq | n_diff_pfx04 | g h, a、b - - - - - - - - - - - - | + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +gydF4y2Ba
基于上面所示的索引统计数据表定义,可以确定以下值:gydF4y2Ba
n_cols_in_uniq_igydF4y2Ba
,所有独特的索引列的总数不包括主键列,是2 (gydF4y2BacgydF4y2Ba
和gydF4y2BadgydF4y2Ba
)gydF4y2Ban_cols_in_non_uniq_igydF4y2Ba
,所有列的总数nonunique索引,是4 (gydF4y2BaegydF4y2Ba
,gydF4y2BafgydF4y2Ba
,gydF4y2BaggydF4y2Ba
和gydF4y2BahgydF4y2Ba
)gydF4y2Ban_cols_in_pkgydF4y2Ba
主键的列数,是2 (gydF4y2Ba一个gydF4y2Ba
和gydF4y2BabgydF4y2Ba
)gydF4y2Ban_non_uniq_igydF4y2Ba
nonunique索引的表的数量,是2 (gydF4y2Bai2nonuniqgydF4y2Ba
和gydF4y2Bai3nonuniqgydF4y2Ba
))gydF4y2Ban_partgydF4y2Ba
分区的数量,是1。gydF4y2Ba
你现在可以计算gydF4y2Bainnodb_stats_persistent_sample_pagesgydF4y2Ba
*(2 + 4 + 2 *(1 + 2)* 1,确定叶片扫描的页面的数量。与gydF4y2Bainnodb_stats_persistent_sample_pagesgydF4y2Ba
设置为默认值gydF4y2Ba20.gydF4y2Ba
,默认页面大小为16gydF4y2Ba简约gydF4y2Ba
(gydF4y2Bainnodb_page_sizegydF4y2Ba
= 16384),然后您可以估计,20 * 12 * 16384gydF4y2Ba字节gydF4y2Ba
读表gydF4y2BatgydF4y2Ba
(约4gydF4y2BaMiBgydF4y2Ba
。gydF4y2Ba
所有4gydF4y2BaMiBgydF4y2Ba
可能不是从磁盘读取,像一些叶子页面缓存可能已经在缓冲池中。gydF4y2Ba