ITPub博客

首页 > 数据库 > > 14.6.13 为索引页面配置合并阈值

14.6.13 为索引页面配置合并阈值

作者:飘絮絮絮丶 时间:2020-05-12 10:00:22 0 删除 编辑

参考官方文档:

dev.mysql.com/doc/refma


您可以为索引页面配置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为单个索引设置MERGE_THRESHOLD:

CREATE TABLE t1 ( id INT, KEY id_index (id) COMMENT 'MERGE_THRESHOLD=40' );


  • 使用ALTER TABLE为单个索引设置MERGE_THRESHOLD:


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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42158