第14期:数据页合并( 二 )
4. MERGE_THRESHOLD 设置效果评估
innodb_metrics 表提供了两个计数器来跟踪页合并(Innodb_metrics 表非常有用 , 后期单独开篇详细来介绍 。 )
这两个计数器默认是屏蔽的 , 需要显式开启 ,
mysql> SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS-> WHERE NAME like '%index_page_merge%';+-----------------------------+----------------------------------------+| NAME| COMMENT|+-----------------------------+----------------------------------------+| index_page_merge_attempts| Number of index page merge attempts|| index_page_merge_successful | Number of successful index page merges |+-----------------------------+----------------------------------------+2 rows in set (0.00 sec)
开启这两个计数器 ,
mysql> set global innodb_monitor_enable='index_page_merge_attempts';Query OK, 0 rows affected (0.00 sec)mysql> set global innodb_monitor_enableQuery OK, 0 rows affected (0.00 sec)
建立两张表 , MERGE_THRESHOLD 分别为默认值和 20 , 导入同样的 10000 条记录 , 看看页面合并的对比 。
mysql> create table t1_max(id int primary key , r1 int, keyidx_r1 (r1));Query OK, 0 rows affected (0.08 sec)mysql> create table t1_min(id int, primary key (id) comment 'MERGE_THRESHOLDQuery OK, 0 rows affected (0.08 sec)
对比前 , 先清空计数器;禁止后;重置计数器 。
mysql> set global innodb_monitor_disable='index_page_merge_attempts';Query OK, 0 rows affected (0.00 sec)mysql> set global innodb_monitor_disableQuery OK, 0 rows affected (0.00 sec)mysql> set global innodb_monitor_reset_allQuery OK, 0 rows affected (0.00 sec)mysql> set global innodb_monitor_enableQuery OK, 0 rows affected (0.00 sec)
先往表 t1_max 里随机插入 1000 条记录 。
replace into t1_max select ceil(rand()*1000),ceil(rand()*100) ;...mysql> select count(*) from t1_max+----------+| count(*) |+----------+|1000 |+----------+1 row in set (0.03 sec)
再删掉 500 条记录
mysql> delete from t1_max limit 500;Query OK, 500 rows affected (0.05 sec)
查看计数器结果 , 尝试合并 707 次 , 合并成功 20 次 。
mysql> SELECT name,count,max_count,avg_countFROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME like '%index_page_merge%';+-----------------------------+-------+-----------+--------------------+| name| count | max_count | avg_count|+-----------------------------+-------+-----------+--------------------+|| index_page_merge_successful |20 |20 |0.072992700729927 |+-----------------------------+-------+-----------+--------------------+2 rows in set (0.00 sec)
再清空计数器 , 对表 t1_min 执行同样的操作 ,
mysql> select count(*) from t1_min;+----------+| count(*) |+----------+|500 |+----------+1 row in set (0.02 sec)mysql> delete from t1_min limit 500Query OK, 500 rows affected (0.02 sec)
再次查看计数器 , 尝试合并 30 次 , 实际成功次数仅仅为 2 。 比默认的合并次数少了 20 多倍 。 所以可以看到 , 在一定的数据模型下 , 手动控制合并临界值对数据页的合并频率调节非常有效 。
mysql> SELECT name,count,max_count,avg_countFROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME like '%index_page_merge%';+-----------------------------+-------+-----------+---------------------+| name| count | max_count | avg_count|+-----------------------------+-------+-----------+---------------------+|| index_page_merge_successful |2 |2 | 0.03333333333333333 |+-----------------------------+-------+-----------+---------------------+2 rows in set (0.00 sec)
当然 , 设置成最小值 1 , 基本上不会合并了 , 结果应该如下 。
mysql> SELECT name,count,max_count,avg_countFROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME like '%index_page_merge%';+-----------------------------+-------+-----------+-----------+| name| count | max_count | avg_count |+-----------------------------+-------+-----------+-----------+|| index_page_merge_successful |0 |NULL |0 |+-----------------------------+-------+-----------+-----------+2 rows in set (0.00 sec)
总结这篇我介绍了 MySQL 索引页合并临界值的概念以及如何在实际环境中评估这个值对索引页合并以及拆分的影响 , 有问题或者相关建议欢迎指正回复 。
关于 MySQL 的技术内容 , 你们还有什么想知道的吗?赶紧留言告诉小编吧!
文章插图
- 索尼Xperia|力压iPhone13 Pro Max,续航排名第一,仅售1699元
- 优派|美国很满意:150多家芯片厂商,都“自愿”提交了详细数据
- 苹果|要是不看真实数据,我还以为国产机将iPhone打成下一个三星了呢
- 智能网联汽车|我国智慧城市基础设施与智能网联汽车协同发展第二批试点城市公布
- 苹果|华为无奈,苹果“踩着”国产厂商再度登顶第一,国内市场该醒醒了
- iphone13|iPhone13 缺货问题得到改善,发货时间变快,第三方优惠将更大
- 红米手机|手机好评榜“洗牌”:红米进前三,第一名存在感逐渐走低!
- 何树山|合肥国际互联网数据专用通道开通
- 武汉|武汉TCL华星柔性屏出货量全球第四
- 区块链|再不自封“元宇宙第一人”就晚了