13.7.2.1 ANALYZE TABLE 语句

ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE tbl_name [, tbl_name] ...

ANALYZE TABLE执行密钥分布分析,并存储一个或多个命名 table 的分布。对于MyISAMtable,此语句等效于使用myisamchk --analyze

该语句要求 table 具有SELECTINSERT特权。

ANALYZE TABLE可用于InnoDBNDBMyISAMtable。它不适用于视图。

分区 table 支持ANALYZE TABLE,您可以使用ALTER TABLE ... ANALYZE PARTITION分析一个或多个分区;有关更多信息,请参见第 13.1.8 节“ ALTER TABLE 语句”第 22.3.4 节“分区维护”

在分析期间,该 table 被InnoDBMyISAM的读锁锁定。

ANALYZE TABLE从 table 定义缓存中删除该 table,这需要刷新锁。如果仍有长时间运行的语句或事务仍在使用该 table,则后续的语句和事务必须 await 这些操作完成才能释放刷新锁。因为ANALYZE TABLE本身通常很快完成,所以显然看不到涉及同一 table 的延迟事务或语句是由于剩余的刷新锁引起的。

默认情况下,服务器将ANALYZE TABLE语句写入二进制日志,以便它们复制到副本。要禁止记录日志,请指定可选的NO_WRITE_TO_BINLOG关键字或其别名LOCAL

ANALYZE TABLE 输出

ANALYZE TABLE返回具有下 table 所示列的结果集。

ColumnValue
Tabletable 名
Op一律analyze
Msg_typestatuserrorinfonotewarning
Msg_text信息性消息
密钥分布分析

如果自上次密钥分配分析以来该 table 未更改,则不会再次分析该 table。

MySQL 使用存储的键分布来确定 table 的连接 Sequences,以进行除常量之外的连接。此外,在决定对查询中的特定 table 使用哪些索引时,可以使用键分布。

要检查存储的密钥分发基数,请使用SHOW INDEX语句或INFORMATION_SCHEMA STATISTICStable。参见第 13.7.5.22 节,“ SHOW INDEX 语句”第 24.24 节“ INFORMATION_SCHEMA STATISTICStable”

对于InnoDB个 table,ANALYZE TABLE通过对每个索引树执行随机潜水并相应地更新索引基数估计来确定索引基数。因为这些只是估算值,所以重复运行ANALYZE TABLE可能会产生不同的数字。这会使InnoDBtable 上的ANALYZE TABLE快速运行,但由于没有考虑所有行,因此不能 100%准确。

您可以通过启用innodb_stats_persistent使ANALYZE TABLE收集的statistics更加精确和稳定,如第 14.8.11.1 节“配置持久性优化器统计参数”中所述。启用innodb_stats_persistent时,在对索引列数据进行重大更改之后运行ANALYZE TABLE很重要,因为不会定期重新计算统计信息(例如在服务器重新启动之后)。

如果启用了innodb_stats_persistent,则可以通过修改innodb_stats_persistent_sample_pages系统变量来更改随机潜水的次数。如果禁用了innodb_stats_persistent,则改为修改innodb_stats_transient_sample_pages

有关InnoDB中的密钥分发分析的更多信息,请参见第 14.8.11.1 节“配置持久性优化器统计参数”第 14.8.11.3 节“估计 InnoDBtable 的分析 table 复杂性”

MySQL 在联接优化中使用索引基数估计。如果没有以正确的方式优化联接,请尝试运行ANALYZE TABLE。在少数情况下,ANALYZE TABLE不能为您的特定 table 提供足够好的值,您可以在查询中使用FORCE INDEX来强制使用特定的索引,或者设置max_seeks_for_key系统变量以确保 MySQL 比 table 扫描更喜欢索引查找。参见第 B.4.5 节“与优化程序有关的问题”

Other Considerations

ANALYZE TABLEINFORMATION_SCHEMA.INNODB_SYS_TABLESTATStable 中清除 table 统计信息,并将STATS_INITIALIZED列设置为Uninitialized。下次访问该 table 时,将再次收集统计信息。