本文介绍为 InnoDB 索引配置默认合并阈值的相关信息。
- MySQL 8.4 版本,且内核小版本在 MySQL 8.4.7_20260415 及以上。
- MySQL 8.0 版本,且内核小版本在 MySQL 8.0.43_20251015 和 MySQL 8.0.43_20260216 之间。
- MySQL 5.7 版本,且内核小版本在 MySQL 5.7.44_20251015 和 MySQL 5.7.44_20260216 之间。
说明
MySQL 8.0 版本的 MySQL 8.0.43_20260415 内核小版本以及 MySQL 5.7 版本的 MySQL 5.7.44_20260415 内核小版本,已经对 InnoDB 索引的填充逻辑进行了优化,减少了索引分裂、合并的频率,因此之后的内核小版本无需手动配置 InnoDB 索引的默认合并阈值。
云盘场景下,云盘 IO 带宽常成为性能瓶颈。
经分析,在频繁更新场景中,InnoDB 的 B+ 树索引页会频繁分裂、合并。每次索引页分裂或合并时,会致使较多页被修改,成为脏页,需刷入云盘,且索引页分裂或合并时还需写入较多的 redo 日志,进一步加剧了云盘 IO 的压力。
InnoDB B+ 树索引有一个 merge threshold 属性,当一个索引页的填充率小于 merge threshold 时,InnoDB 会尝试将该页与相邻页进行合并。InnoDB B+ 树索引的默认 merge threshold 为 50%,这意味着,InnoDB 会时常将两个填充率在 50% 左右的索引页合并为一个填充率近乎为 100% 的索引页,一旦有新数据插入,刚合并的索引页将不得不再次分裂,进而导致频繁的分裂、合并。
基于上述分析,可通过调小 B+ 树索引的 merge threshold,减少索引分裂、合并的次数,从而减轻云盘 IO 压力,提升整体性能。MySQL 允许通过 COMMENT 设置 merge threshold,例如:
此外,MySQL 还允许在表级别通过 COMMENT 设置合并阈值(merge threshold),此设置会影响该表的全部索引,例如:
虽然 MySQL 提供了配置合并阈值(merge threshold)的方式,但在本特性上线之前,默认的合并阈值不可配置,始终为 50%。本特性旨在提供一种配置默认合并阈值的方式,以便用户更灵活地调整 InnoDB 索引的合并阈值,从而在云盘等输入/输出(IO)带宽成为瓶颈的场景下,获得更优的性能。
云数据库 MySQL 版提供了一个可修改参数 loose_innodb_default_index_merge_threshold,用于配置 InnoDB 二级索引的默认合并阈值(merge threshold)。
注意
主键索引的 merge threshold 变化后,可能导致表占用的空间大幅膨胀,因此对 loose_innodb_default_index_merge_threshold 的修改仅影响 InnoDB 二级索引的默认合并阈值(merge threshold),InnoDB 主键索引的默认合并阈值不受影响,仍为 50%。如需修改主键索引的默认合并阈值,可以在主键索引的 COMMENT 中手动指定。
- 在 SESSION 级别设置参数 loose_innodb_default_index_merge_threshold 。
- 该 SESSION 后续创建 InnoDB 二级索引时,若未指定 merge threshold,则其 merge threshold 默认为 40%:
- loose_innodb_default_index_merge_threshold 仅能指定 InnoDB 二级索引的默认 merge threshold,不会改变 InnoDB 主键索引的默认 merge threshold,InnoDB 主键索引的默认 merge threshold 当前固定为 50%。
- loose_innodb_default_index_merge_threshold 仅影响 InnoDB B+ 树索引,空间索引、全文索引以及向量索引没有 merge threshold 的概念,自然不受此参数影响。
- 实例规格:云数据库 MySQL 版,云盘通用型 8C32G
- Sysbench 数据量:16 张 2KW 行 sysbench 表(约 72GB)
- Sysbench 测试用例:oltp_update_index
在云盘场景下,分别将 loose_innodb_default_index_merge_threshold 配置为 50 和 25,记录不同并发数下 TPS 结果如下图所示。
在不同并发数下,loose_innodb_default_index_merge_threshold 配置为 25 时的 TPS 比配置为 50 时的 TPS 高出 5%~20%。