热度 1|
INNODB_STATS_PERSIST=ON
或用STATS_PERSIST=1
定义单个表时,优化器统计信息将持久化到磁盘。默认情况下,innodb_stats_persistent
是启用的。
持久统计信息存储在mysql.innodb_table_stats
和mysql.innodb_index_stats
表中。
默认情况下启用的innodb_stats_auto_recalc
变量控制当表中超过10%的行发生更改时是否自动计算统计信息。可以通过在创建或更改表时指定STATS_AUTO_RECALC
子句来为单个表配置自动统计数据重新计算。
由于在后台进行的自动统计数据重新计算的异步性质,即使启用了innodb_stats_auto_recalc
,在运行影响表10%以上的DML操作后,也不会立即重新计算统计数据。在某些情况下,统计数据的重新计算可能会延迟几秒钟。如果立即需要最新的统计数据,运行ANALYZE TABLE以启动统计数据的同步(前台)重新计算。
如果禁用innodb_stats_auto_recalc
则可以通过在对索引列进行大量更改后执行ANALYZE TABLE语句来确保优化器统计信息的准确性。
当INNODB_STATS_PERSIST=OFF
或使用STATS_PERSIST=0
创建或更改单个表时,优化器统计信息不会持久化到磁盘。相反,统计信息存储在内存中,当服务器关闭时会丢失。统计数据也会通过某些操作和在某些条件下定期更新。
当向现有表中添加索引时,或者当添加或删除列时,无论innodb_stats_auto_recalc
的值如何,都会计算索引统计信息并将其添加到innodb_index_stats
表中。
innodb_stats_on_metadata=ON
情况下,执SHOW TABLE STATUS, SHOW INDEX, 查询INFORMATION_SCHEMA下的TABLES, STATISTICS非持久化统计信息的缺点显而易见,数据库重启后如果大量表开始更新统计信息,会对实例造成很大影响,所以目前都会使用持久化统计信息。
我们查看执行计划,发现未使用正确的索引,如果是innodb_index_stats中统计信息差别较大引起,可通过以下方式处理:
ANALYZETABLE TABLE_NAME;
a. 全局变量INNODB_STATS_PERSISTENT_SAMPLE_PAGES
默认为20;
b. 单个表可以指定该表的采样:
ALTER TABLE TABLE_NAME STATS_SAMPLE_PAGES=40;
经测试,此处STATS_SAMPLE_PAGES
的最大值是65535,超出会报错。
c. 手动更新innodb_table_stats
和innodb_index_stats
表统计信息(修改这两个表不会产生binlog),然后使用FLUSH TABLE tbl_name
语句加载更新后的统计信息。
合作电话:010-64087828
社区邮箱:greatsql@greatdb.com