You need to enable JavaScript to run this app.
文档中心
云数据库 MySQL 版

云数据库 MySQL 版

复制全文
下载 pdf
性能
配置 InnoDB 索引的默认合并阈值(merge threshold)
复制全文
下载 pdf
配置 InnoDB 索引的默认合并阈值(merge threshold)
本文介绍为 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,例如:​
​
-- pk 的 merge threshold 为 40%,k1 的 merge threshold 为 30%​
CREATE TABLE t(​
id INT,​
c1 INT,​
c2 INT,​
PRIMARY KEY pk(id) COMMENT 'MERGE_THRESHOLD=40',​
KEY k1(c1) COMMENT 'MERGE_THRESHOLD=30'​
) ENGINE=innodb;​
​
此外,MySQL 还允许在表级别通过 COMMENT 设置合并阈值(merge threshold),此设置会影响该表的全部索引,例如:​
​
-- index 级别的 COMMENT 优先级更高,因此 pk 的 merge threshold 为 40%,​
-- k1 的 merge threshold 为 30%​
CREATE TABLE t(​
id INT,​
c1 INT,​
c2 INT,​
PRIMARY KEY pk(id),​
KEY k1(c1) COMMENT 'MERGE_THRESHOLD=30'​
) ENGINE=innodb COMMENT='MERGE_THRESHOLD=40';​
​
特性说明​
虽然 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 中手动指定。​
​
参数名称​
类型​
默认值​
是否需要重启以生效​
取值范围​
级别​
参数描述​
loose_innodb_default_index_merge_threshold​
int​
  • 实例的存储类型为本地盘时,该参数的运行值为 50。​
  • 实例的存储类型为云盘时,该参数的运行值为 25。​
否​
​
[1, 50]​
GLOBAL | SESSION​
用于设置 InnoDB 二级索引的默认 合并阈值(merge threshold)。​
​
使用示例​
  1. 在 SESSION 级别设置参数 loose_innodb_default_index_merge_threshold 。​
​
SET SESSION loose_innodb_default_index_merge_threshold = 40;​
​
  1. 该 SESSION 后续创建 InnoDB 二级索引时,若未指定 merge threshold,则其 merge threshold 默认为 40%:​
​
SET SESSION loose_innodb_default_index_merge_threshold = 40;​
​
-- pk 是主键索引,merge threshold 为 50%,k1 是二级索引,merge threshold 为 40%​
CREATE TABLE t(​
id INT,​
c1 INT,​
c2 INT,​
PRIMARY KEY pk(id),​
KEY k1(c1)​
) ENGINE=innodb;​
​
-- k2 是二级索引,merge threshold 为 40%​
CREATE INDEX k2 ON t(c2);​
​
注意事项​
  • 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 的概念,自然不受此参数影响。​
性能数据​
测试环境​
  • 测试版本:5.7 版本​
  • 实例规格:云数据库 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%。​
最近更新时间:2026.10.09 18:07:11
这个页面对您有帮助吗?
有用
有用
无用
无用