【问题标题】:MySQL: What is a sample page?MySQL:什么是示例页面?
【发布时间】:2017-05-19 18:39:47
【问题描述】:

我最近遇到了一个问题,即 MySQL 查询的 EXPLAIN 计划发生了巨大变化,并对查询运行时间产生了负面影响。在我们努力解决这个问题的过程中,我们考虑将innodb_stats_sample_page 从 MySQL 的默认值 8 增加。在我的搜索过程中,我发现了有关这样做的利弊的文献,以及如何为此选择最佳值变量,但我无法找到任何关于 what sample page 实际上是的解释。

他们的目的很明确:

MySQL 查询优化器使用有关键分布的估计统计信息来根据索引的相对选择性为执行计划选择索引。某些操作会导致 InnoDB 从表上的每个索引中随机抽取页面以估计索引的基数。 (这种技术称为随机潜水。)这些操作包括 ANALYZE TABLE 语句、SHOW TABLE STATUS 语句以及重新启动后首次访问表。

page 并不能解释 sample page 的实际含义。那么,sample page 究竟是什么

【问题讨论】:

  • 您使用的是哪个版本的 MySQL?最近这方面发生了实质性的变化。
  • 版本为5.5

标签: mysql performance optimization


【解决方案1】:

InnoDB 将所有记录存储在一个固定大小的单元中,这通常是 称为“页面”(尽管 InnoDB 有时将其称为“块”)。 目前所有页面的大小都相同,均为 16KB。

https://dev.mysql.com/doc/internals/en/innodb-page-structure.html

【讨论】:

  • 跟进问题:你知道样本中将使用哪些页面吗?
  • 文档说“随机”.. 所以.. 可能是对内部页面列表的随机访问
  • 澄清一下,如果我自己运行ANALYZE TABLE,连续两次没有任何页面更改,我可以假设两次执行中将使用完全相同的页面,还是我必须每次我运行它时都向 RNGesus 祈祷,因为它是 100% 随机的(ish)?
  • 不...不祈祷..(我希望祈祷是为了最重要的事情)。但是大脑..简单的答案是解决的基数是相同的..查询分析器/ optimezer按预期工作..
【解决方案2】:

页是一个内存块,其中存储了多条记录(对于单个表),索引算法可以对表的随机页(即存储在表的任何页中的记录)进行一些假设表中的所有记录。因此,它可以猜测在不分析每条记录的情况下使用该表中的特定索引会有多大用处。

查看documentation 了解有关页面/块结构的详细信息

为什么是随机页而不是随机记录? 因为一页存储在连续内存中,可以在一次内存操作中访问,所以在一次内存操作中可以获得多条记录。

它如何确定要分析的页面? 任何页面都会被提取,因为没有哪个特定页面比另一个页面更好。

如果我不更改该表中的记录,它会始终选择相同的页面吗? 不会,它每次尝试对该表进行采样时都会采用不同的随机页面。但是如果记录之间没有大的差异,不同的采样页面可能会导致使用相同的索引。但如果存在很大差异(例如,最初表中特定字段为空,然后添加了该字段的非空的一半),则可以使用其他索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2023-03-19
    • 2012-05-18
    相关资源
    最近更新 更多