我最近遇到了一个问题,即MySQL查询的EXPLAIN
计划发生了巨大变化,并对查询运行时间产生了负面影响。在我们解决这个问题的努力中,我们考虑从MySQL的默认值8增加innodb_stats_sample_page
。在我的搜索中,我发现了关于这样做的利弊的文献,以及如何选择最佳值对于该变量,但我无法找到关于实际上是什么 sample page
的任何解释。
他们的目的很明确:
MySQL查询优化器使用关于关键分布的估计统计信息,根据索引的相对选择性选择执行计划的索引。某些操作会导致InnoDB从表上的每个索引中对随机页面进行采样,以估计索引的基数。 (此技术称为随机潜水。)这些操作包括ANALYZE TABLE语句,SHOW TABLE STATUS语句,以及重新启动后第一次访问表。
page并未解释sample page
实际上是什么。那么,究竟是什么一个sample page
?
答案 0 :(得分:1)
InnoDB将所有记录存储在固定大小的单元内,这通常是 称为"页面" (尽管InnoDB有时将其称为" block"而不是)。 目前所有页面大小相同,为16KB。
https://dev.mysql.com/doc/internals/en/innodb-page-structure.html
答案 1 :(得分:1)
页面是一个内存块,其中存储了多个记录(对于单个表),索引算法可以采用表的随机页面(即存储在表的任何页面中的记录)来做出一些假设表中的所有记录。因此,它可以猜测在不分析每条记录的情况下,在该表中使用特定索引是多么有用。
检查documentation以获取有关页面/块结构的详细信息
为什么是随机页面而不是随机记录?因为页面存储在连续内存中,可以在一次内存操作中访问,所以在内存操作中你可以获得多条记录。 / p>
如何确定要分析哪个页面?任何页面都被采用,因为没有特定页面比其他页面更好的样本。
如果我不更改该表中的记录,它是否总是选择相同的页面?不,它不会,每次尝试对该表进行采样时都会采用不同的随机页面。但是,如果记录之间没有很大差异,则不同的采样页面可能会导致使用相同的索引。但是如果存在很大差异(例如,最初表格对于特定字段为空,然后其中一半为该字段添加了非空值),则可以使用其他索引。