[[toc]]
1. 语法
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
TABLE tbl_name [, tbl_name] ...
ANALYZE TABLE 执行键分布分析并存储指定表的分布。对于MyISAM表,该语句相当于使用myisamchk --analyze。
此语句需要表的 SELECT 和 INSERT 权限。
ANALYZE TABLE 适用于 InnoDB、NDB 和 MyISAM 表。它不适用于视图。
分区表支持ANALYZE TABLE,可以使用ALTER TABLE … ANALYZE PARTITION来分析一个或多个分区;
在分析过程中,对于InnoDB和MyISAM表使用读锁进行锁定。
ANALYZE TABLE 从表定义缓存中删除表,这需要刷新锁。如果有长时间运行的语句或事务仍在使用该表,则后续语句和事务必须等待这些操作完成才能释放刷新锁。由于 ANALYZE TABLE 本身通常会很快完成,因此涉及同一表的延迟事务或语句是否是由于剩余的刷新锁导致的可能并不明显。
默认情况下,服务器将 ANALYZE TABLE 语句写入二进制日志,以便它们复制到副本。要抑制日志记录,请指定可选的 NO_WRITE_TO_BINLOG 关键字或其别名 LOCAL。
2. ANALYZE TABLE 输出信息
ANALYZE TABLE 返回一个结果集,其中包含下表中所示的列
| 列名 | 值 |
|---|---|
| Table | 表名 |
| Op | analyze |
| Msg_type | status, error, info, note, or warning |
| Msg_text | 信息 |
3. 密钥分布分析
如果自上次密钥分布分析以来该表未发生更改,则不会再次分析该表。
MySQL 使用存储的键分布来决定表连接顺序,以连接除常量之外的其他内容。此外,在决定对查询中的特定表使用哪些索引时,可以使用键分布。
要检查存储的键分布基数,请使用 SHOW INDEX 语句或 INFORMATION_SCHEMA STATISTICS 表。
对于 InnoDB 表,ANALYZE TABLE 通过对每个索引树执行随机潜水并相应地更新索引基数估计来确定索引基数。因为这些只是估计值,重复运行 ANALYZE TABLE 可能会产生不同的数字。这使得 ANALYZE TABLE 在 InnoDB 表上速度很快,但不是 100% 准确,因为它没有考虑所有行。
您可以通过启用 innodb_stats_persistent 使 ANALYZE TABLE 收集的统计信息更精确、更稳定。当启用 innodb_stats_persistent 时,在对索引列数据进行重大更改后运行 ANALYZE TABLE 非常重要,因为统计信息不会定期重新计算(例如在服务器重新启动后)。
如果启用了innodb_stats_persistent,则可以通过修改innodb_stats_persistent_sample_pages系统变量来更改随机潜水的数量。如果 innodb_stats_persistent 被禁用,请改为修改 innodb_stats_transient_sample_pages 。
MySQL 在连接优化中使用索引基数估计。如果未以正确的方式优化联接,请尝试运行 ANALYZE TABLE。在少数情况下,ANALYZE TABLE 不能为您的特定表生成足够好的值,您可以在查询中使用 FORCE INDEX 来强制使用特定索引,或者设置 max_seeks_for_key 系统变量以确保 MySQL 更喜欢索引查找而不是表扫描。
4. 其他因素
ANALYZE TABLE 从信息模式 INNODB_SYS_TABLESTATS 表中清除表统计信息,并将 STATS_INITIALIZED 列设置为 Uninitialized。下次访问该表时将再次收集统计信息。




