大量删除数据之后立刻检查页合并计数器,再用一条完全不命中数据的DELETE去'路过'同一片索引区域,看合并到底是什么时候真实被触发的。
代码SET GLOBAL innodb_monitor_enable='index_page_merge_successful'; SET GLOBAL innodb_monitor_enable='index_page_merge_attempts'; DELETE FROM seq_pk WHERE id % 10 < 7; -- 真实删掉约70%的行
删除70%的行之后: index_page_merge_attempts: 0 index_page_merge_successful: 0 ← 真实都还是0
本以为删掉这么大比例的数据,会真实立刻触发一批相邻页面因为都变得很空而合并,结果两个计数器真实都停在0。这和上一篇《簇索引页分裂》里"插入立刻触发分裂"的即时性完全不对称——分裂是插入路径上真实必须马上处理的(页面写不下新数据了,不能拖),但合并没有这种紧迫性,一个变空的页面哪怕暂时保留着不合并,也不影响数据的正确性,只是浪费了一些空间。
代码-- 这条DELETE的条件范围内,真实没有任何一行数据存在 DELETE FROM seq_pk WHERE id BETWEEN 300000 AND 600000;
这条0行命中的DELETE执行之后: index_page_merge_attempts: 146 ← 真实凭空多了146次 index_page_merge_successful: 10 ← 真实有10次真的合并成功了
每一步都是本文上面用真实计数器跑出来的原始结果。
information_schema.INNODB_METRICS里的index_page_merge_attempts/index_page_merge_successful