首页 > 数据库 > > 14.6.13 为索引页面配置合并阈值
参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/index-page-merge-threshold.html
您可以为索引页面配置MERGE_THRESHOLD值。 如果索引页面的“页面已满”百分比低于MERGE_THRESHOLD值(当行被删除或行被UPDATE操作缩短时),InnoDB会尝试合并索引页与相邻索引页。 默认的MERGE_THRESHOLD值是50,这是以前的硬编码值。 MERGE_THRESHOLD的最小值为1,最大值为50。
当索引页面的“页面已满”百分比低于默认MERGE_THRESHOLD设置的50%时,InnoDB会尝试合并索引页面和相邻页面。 如果两页都接近50%已满,则在页面合并后不久可能会发生页面拆分。 如果这种合并分割行为频繁发生,它可能会对性能产生不利影响。 为避免频繁的合并拆分,可以降低MERGE_THRESHOLD值,以便InnoDB尝试以较低的“页面满”百分比合并页面。 以较低页面百分比合并页面会在索引页面留出更多空间,并有助于减少合并拆分行为。
索引页面的MERGE_THRESHOLD可以为表格或单个索引定义。 为单个索引定义的MERGE_THRESHOLD值优先于为该表定义的MERGE_THRESHOLD值。 如果未定义,则MERGE_THRESHOLD值默认为50。
为表设置MERGE_THRESHOLD
您可以使用CREATE TABLE语句的table_option COMMENT子句为表设置MERGE_THRESHOLD值。 例如:
CREATE TABLE t1 ( id INT, KEY id_index (id) ) COMMENT='MERGE_THRESHOLD=45';
您还可以使用ALTER TABLE的table_option COMMENT子句为现有表设置MERGE_THRESHOLD值:
CREATE TABLE t1 ( id INT, KEY id_index (id) );
ALTER TABLE t1 COMMENT='MERGE_THRESHOLD=40';
为单个索引设置MERGE_THRESHOLD
要为单个索引设置MERGE_THRESHOLD值,可以使用CREATE TABLE,ALTER TABLE或CREATE INDEX的index_option COMMENT子句,如以下示例所示:
CREATE TABLE t1 ( id INT, KEY id_index (id) COMMENT 'MERGE_THRESHOLD=40' );
CREATE TABLE t1 ( id INT, KEY id_index (id) );
ALTER TABLE t1 DROP KEY id_index; ALTER TABLE t1 ADD KEY id_index (id) COMMENT 'MERGE_THRESHOLD=40';
使用CREATE INDEX为单个索引设置MERGE_THRESHOLD:
CREATE TABLE t1 (id INT);
CREATE INDEX id_index ON t1 (id) COMMENT 'MERGE_THRESHOLD=40';
注意:
您不能在GEN_CLUST_INDEX的索引级别修改MERGE_THRESHOLD值,GEN_CLUST_INDEX是在创建InnoDB表时没有主键或唯一键索引时由InnoDB创建的聚集索引。 您只能通过为表格设置MERGE_THRESHOLD来修改GEN_CLUST_INDEX的MERGE_THRESHOLD值。
查询索引的MERGE_THRESHOLD值
索引的当前MERGE_THRESHOLD值可以通过查询INNODB_SYS_INDEXES表获得。 例如:
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES WHERE NAME='id_index' \G *************************** 1. row ***************************
INDEX_ID: 91
NAME: id_index
TABLE_ID: 68
TYPE: 0 N_FIELDS: 1
PAGE_NO: 4
SPACE: 57
MERGE_THRESHOLD: 40
如果使用table_option COMMENT子句显式定义,则可以使用SHOW CREATE TABLE来查看表的MERGE_THRESHOLD值:
mysql> SHOW CREATE TABLE t2 \G *************************** 1. row ***************************
Table: t2 Create Table:
CREATE TABLE `t2` ( `id` int(11) DEFAULT NULL,
KEY `id_index` (`id`) COMMENT 'MERGE_THRESHOLD=40' )
ENGINE=InnoDB DEFAULT CHARSET=latin1
注意:
在索引级定义的MERGE_THRESHOLD值优先于为表定义的MERGE_THRESHOLD值。 如果未定义,MERGE_THRESHOLD默认为50%(MERGE_THRESHOLD = 50,这是之前的硬编码值)
同样,如果使用index_option COMMENT子句显式定义,则可以使用SHOW INDEX查看索引的MERGE_THRESHOLD值:
mysql> SHOW INDEX FROM t2 \G *************************** 1. row ***************************
Table: t2 Non_unique: 1
Key_name: id_index
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment: MERGE_THRESHOLD=40
测量MERGE_THRESHOLD设置的效果
INNODB_METRICS表提供了两个计数器,可用于测量MERGE_THRESHOLD设置对索引页合并的影响。
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 |
+-----------------------------+----------------------------------------+
在降低MERGE_THRESHOLD值时,目标是:
MERGE_THRESHOLD设置太小可能会由于空白页面空间过多而导致大型数据文件。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3138817/ ,如需转载,请注明出处,否则将追究法律责任。