OPTIMIZE 表和 ANALYZE 表 MySQL 5.6 的查询性能

Ada*_*lla 1 innodb mysql-5.6

该网站上有很多与optimize table和相关的问题/答案analyze table.

问题:如果我们想快速执行 DDL/DML/SELECT,即使表上有碎片,也不考虑空间,我们可以只执行analyze table命令吗?因为我们有 500GB 大小的表和存储引擎,所以innodb它需要时间来optimize table指挥。

根据 MySQL 文档,优化表分析表

  1. Optimize table重新组织表数据和关联索引数据的物理存储,以减少存储空间并提高访问表时的I/O效率。
  2. Analyze table执行键分布分析并存储指定表的分布

我认为,如果我们不关心空块使用的空间,表统计信息是最新的,则无需优化表。

Bil*_*win 5

正确的。OPTIMIZE TABLE 将数据复制到新的表空间,并重建索引。对于一张大桌子来说,这需要很长时间。

对 InnoDB 表进行碎片整理并不能显着提高性能,因为无论如何,页面在内部通常都是无序存储的。也就是说,为了让 InnoDB 返回“下一行”,它可能必须遵循从当前页到另一个页的指针,而该页可能在物理上远离当前页。由于这是 InnoDB 在非碎片表空间中的正常行为,因此如果中间的页面被占用或空白,可能不会产生任何影响。

如果对表空间进行碎片整理可以产生更有效的页面打包,则可能会有所帮助,因此缓冲池中缓存的页面代表了表的行和索引的更大子集。

分析表不会花费很长时间,对于大表也不会花费更长的时间。它读取固定数量的页面作为表的样本,并基于此估计索引基数和平均行大小以及其他一些统计信息。默认情况下,这会采样 8 或 20 个页面,具体取决于是否启用持久统计信息。

分析表提高性能的方式是它更新优化器用于为给定查询选择索引的统计信息。如果更新的统计数据不会对索引的选择产生任何重大影响,则不会对性能产生任何影响。只有新的统计信息是否会导致优化器选择更有利的索引才重要。