由于个人能力有限,文中可能存在错误,欢迎批评指正。
1.说明
适用于:MySQL 5.1及更高版本
目的:了解 InnoDB 何时更新表的索引统计信息
InnoDB 索引统计信息的更新可以由多个不同的事件触发,一些触发器也是存在版本依赖, 以下部分将讨论每个触发器:
2.手动更新
2.1. ANALYZE TABLE
ANALYZE TABLE 命令用于更新索引统计信息,例如:
ANALYZE TABLE t1;
2.2. OPTIMIZE TABLE
InnoDB将 OPTIMIZE TABLE 实现为表重建和 ANALYZE TABLE ,因此索引统计信息将也有更新。
stark> OPTIMIZE TABLE t1;
+---------+----------+-----------+-----------------------------------------------------------------+
|Table |Op |Msg_type |Msg_text |
+---------+----------+-----------+-----------------------------------------------------------------+
|stark.t1 |optimize |note |Table does not support optimize,doing recreate + analyze instead |
+---------+----------+-----------+-----------------------------------------------------------------+
|stark.t1 |optimize |status |OK |
+---------+----------+-----------+-----------------------------------------------------------------+
2 rows in set (0.10 sec)
3.元数据统计
如果 innodb_stats_on_metadata = ON
( MySQL 5.5 及更早版本中的默认值,但 MySQL 5.6 中没有),InnoDB 在以下情况下更新统计数据:
-
在查询元数据信息语句中
mysql> SHOW TABLE STATUS; mysql> SHOW INDEX;
-
访问某些 INFORMATION_SCHEMA 表时,例如
INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA.STATISTICS
-
第一次访问某张表;这包含第一次 FLUSH TABLES 之后,FLUSH TABLES WITH READ LOCK
-
DDL 语句导致表重建
使用 innodb_stats_on_metadata = OFF
更新 InnoDB 索引统计信息的主要方法是使用 ANALYZE TABLE 。 由于 InnoDB 将 OPTIMIZE TABLE 实现为表重建,然后是 ANALYZE TABLE ,OPTIMIZE TABLE 还将重新计算统计信息。
4.自动更新
此外,InnoDB 还会在表的 “大部分” 数据更新时触发重新计算索引统计信息,逻辑取决于是使用持久性还是瞬态统计信息:
- 持久统计信息:为表启用 STATS_AUTO_RECALC 时(默认情况下设置为 innodb_stats_auto_recalc 的值,默认情况下启用),索引统计信息在更新时更新 1/10(10%) 行已更改。
- 瞬态统计:距离上一次更新,表中至少修改(这里所说的修改是指 update 及 insert ,不包含 delete )1/16(6.25%) 行时,统计信息会进行更新。