事务处理对持久统计信息自动收集的影响
1. 持久化统计信息
持久统计信息将统计信息存储到磁盘,使它们在服务器重启后保持不变,优化器更有可能在查询时做出一致的选择,从而提高执行计划的稳定性。
在innodb_stats_persistent=ON(默认值)或表定义使用 stats_persistent=1时,优化器统计信息会持久化保存。
持久统计信息存储在 mysql.innodb_table_stats 和 mysql.innodb_index_stats 表中,last_update 列可以看到上次更新统计信息的时间。
系统变量innodb_stats_auto_recalc(默认ON)控制表行更改超过10%时,是否自动计算统计信息。也可以通过创建或更改表时指定stats_auto_recalc子句为单个表配置自动统计重新计算。
由于自动统计信息收集是一个后台线程,其处理过程与DML操作是异步的,在DML操作超过 10% 的表后,可能不会立即重新计算统计信息。在某些情况下,统计数据重新计算可能会延迟几秒钟。如果立即需要最新的统计信息,执行 ANALYZE TABLE 以启动统计信息的同步计算。
事务的 commit 和 rollback 会影响统计信息的自动收集么?通过下面测试,可以回答这问题。
2. 测试commit和rollback对持久统计信息收集的影响
测试环境的系统变量值:- greatsql> SHOW GLOBAL VARIABLES LIKE 'innodb_stats%';
- +--------------------------------------+-------------+
- | Variable_name | Value |
- +--------------------------------------+-------------+
- | innodb_stats_auto_recalc | ON |
- | innodb_stats_include_delete_marked | OFF |
- | innodb_stats_method | nulls_equal |
- | innodb_stats_on_metadata | OFF |
- | innodb_stats_persistent | ON |
- | innodb_stats_persistent_sample_pages | 20 |
- | innodb_stats_transient_sample_pages | 8 |
- +--------------------------------------+-------------+
复制代码 2.1 INSERT 操作
2.2 DELETE 操作
3. 总结
- 数据量变化大(超过10%)的DML操作会导致2次统计信息收集,一次是DML开始时,一次是DML完成约10秒后。
- DML操作是否COMMIT提交,不影响统计信息收集。
- DML操作的rollback回滚,可能造成统计信息与表数据不一致。当大数据DML操作回滚后,可以执行ANALYZE TABLE重新收集表的统计信息。
Enjoy GreatSQL
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |