zoukankan      html  css  js  c++  java
  • MySQL配置索引页的合并阈值

    MySQL配置索引页的合并阈值

    如果删除行或者通过UPDATE操作缩短行
    可以为索引页面配置MERGE_THRESHOLD值。 当delete与update缩短了行长度时,索引页的“page-full”百分比低于MERGE_THRESHOLD值,InnoDB会尝试将索引页与相邻索引页合并。 默认的MERGE_THRESHOLD值为50。 MERGE_THRESHOLD的最小值为1,最大值为50。

    当索引页面的“page-full”百分比低于50%时,InnoDB会尝试将索引页与相邻页合并。 如果两个页面都接近50%已满,则在合并页面后很快就会发生页面拆分。 如果频繁发生此合并拆分行为,则可能会对性能产生负面影响。 为避免频繁的合并拆分,您可以降低MERGE_THRESHOLD值,以便InnoDB以较低的“page-full”百分比尝试页面合并。 以较低页面满百分比合并页面会在索引页面中留出更多空间,并有助于减少合并拆分行为。

    可以为表或单个索引定义索引页的MERGE_THRESHOLD。 为单个索引定义的MERGE_THRESHOLD值优先于为表定义的MERGE_THRESHOLD值。 如果未定义,则MERGE_THRESHOLD值默认为50。

    1. 为表设置MERGE_THRESHOLD

    可以使用CREATE TABLE语句的table_option COMMENT子句为表设置MERGE_THRESHOLD值。例如:

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

    还可以使用带有ALTER TABLEtable_option COMMENT子句为现有表设置MERGE_THRESHOLD值:

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

    2. 为单个索引设置MERGE_THRESHOLD

    要为单个索引设置MERGE_THRESHOLD值,可以将index_option COMMENT子句与CREATE TABLEALTER TABLECREATE INDEX一起使用,如以下示例所示:

    • 使用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';

    3. 查询索引的MERGE_THRESHOLD值

    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

    同样,如果使用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

    4. 查看MERGE_THRESHOLD设置的效果

    INNODB_METRICS表提供了两个计数器,可用于衡量MERGE_THRESHOLD设置对索引页面合并的影响。

    SELECT t.NAME,
           t.SUBSYSTEM,
           t.STATUS,
           t.COMMENT
    FROM INFORMATION_SCHEMA.INNODB_METRICS t
    WHERE t.NAME LIKE '%index_page_merge%';
    
    +-----------------------------+-----------+----------+----------------------------------------+
    | NAME                        | SUBSYSTEM | STATUS   | COMMENT                                |
    +-----------------------------+-----------+----------+----------------------------------------+
    | index_page_merge_attempts   | index     | disabled | Number of index page merge attempts    |
    | index_page_merge_successful | index     | disabled | Number of successful index page merges |
    +-----------------------------+-----------+----------+----------------------------------------+
    2 rows in set (0.00 sec)
    

    降低MERGE_THRESHOLD值时,目标是:

    • 较少的页面合并尝试次数和成功的页面合并次数

    • 相似数量的页面合并尝试和成功的页面合并

    MERGE_THRESHOLD设置太小可能会导致大量数据文件,因为空页空间过多。

  • 相关阅读:
    深刻理解ajax的success和error的实质和执行过程
    再次遇到 js报错: expected expression, get ')' 或 get ';', '<'等错误?
    怎样让一行中的 文字 input输入框 按钮button它们在同一个高度上? 它们中的文字 是 垂直居中对齐
    怎样阻止input file文件域的change/onchange事件多次重复执行?
    如何在 messager/alert/confirm等消息提示框中 获取 / 设置 嵌入 html内容中的 input[type=checkbox]等的选中状态?
    异步函数造成的问题: 怎样确保异步执行的FileReader onload成功后才执行后面的语句?
    如何退出vim的宏记录模式
    bs模态框中的form获取或设置表单及其中元素用nam不能用id?
    关于git 的理解3
    关于git的理解2
  • 原文地址:https://www.cnblogs.com/wanbin/p/9899615.html
Copyright © 2011-2022 走看看