### 15.8.11 配置索引页面的合并阈值

您可以配置`MERGE_THRESHOLD`索引页的值。如果索引页面的“页面满”百分比低于`MERGE_THRESHOLD`删除行或将行缩短时的值[`更新`](update.html)手术，`InnoDB`尝试将索引页与相邻的索引页合并。默认`MERGE_THRESHOLD`值为 50，这是之前硬编码的值。最小值`MERGE_THRESHOLD`值为 1，最大值为 50。

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

这`MERGE_THRESHOLD`可以为表或单个索引定义 for index pages。一种`MERGE_THRESHOLD`为单个索引定义的值优先于`MERGE_THRESHOLD`为表定义的值。如果未定义，则`MERGE_THRESHOLD`值默认为 50。

#### 设置合并\_表的阈值

您可以设置`MERGE_THRESHOLD`使用表的值*`表选项`* `评论`的条款[`创建表`](create-table.html)陈述。例如：

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

您还可以设置`MERGE_THRESHOLD`使用现有表的值*`表选项`* `评论`子句[`更改表`](alter-table.html)：

```
CREATE TABLE t1 (
   id INT,
  KEY id_index (id)
);

ALTER TABLE t1 COMMENT='MERGE_THRESHOLD=40';
```

#### 设置合并\_单个索引的阈值

设置`MERGE_THRESHOLD`单个索引的值，您可以使用*`index_option`* `评论`子句[`创建表`](create-table.html), [`更改表`](alter-table.html)， 要么[`创建索引`](create-index.html)，如以下示例所示：

-   环境`MERGE_THRESHOLD`对于使用单个索引[`创建表`](create-table.html)：

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

-   环境`MERGE_THRESHOLD`对于使用单个索引[`更改表`](alter-table.html)：

    ```
    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';
    ```

-   环境`MERGE_THRESHOLD`对于使用单个索引[`创建索引`](create-index.html)：

    ```
    CREATE TABLE t1 (id INT);
    CREATE INDEX id_index ON t1 (id) COMMENT 'MERGE_THRESHOLD=40';
    ```

笔记

你不能修改`MERGE_THRESHOLD`指数水平的价值`GEN_CLUST_INDEX`，这是由创建的聚集索引`InnoDB`当一个`InnoDB`创建表时没有主键或唯一键索引。你只能修改`MERGE_THRESHOLD`价值`GEN_CLUST_INDEX`通过设置`MERGE_THRESHOLD`为表。

#### 查询 MERGE\_索引的阈值

目前的`MERGE_THRESHOLD`索引的值可以通过查询[`INNODB_INDEXES`](information-schema-innodb-indexes-table.html)桌子。例如：

```
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_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
```

您可以使用[`显示创建表`](show-create-table.html)查看`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=utf8mb4
```

笔记

一种`MERGE_THRESHOLD`在索引级别定义的值优先于`MERGE_THRESHOLD`为表定义的值。如果未定义，`MERGE_THRESHOLD`默认为 50% (`MERGE_THRESHOLD=50`，这是之前硬编码的值。

同样，您可以使用[`显示索引`](show-index.html)查看`MERGE_THRESHOLD`索引的值，如果使用显式定义*`index_option`* `评论`条款：

```
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 的效果\_阈值设置

这[`INNODB_METRICS`](information-schema-innodb-metrics-table.html)表提供了两个计数器，可用于衡量一个效果`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`设置太小可能会由于过多的空白页空间而导致数据文件变大。

    有关使用的信息[`INNODB_METRICS`](information-schema-innodb-metrics-table.html)计数器，见[第 15.15.6 节，“InnoDB 信息\_SCHEMA 指标表”](innodb-information-schema-metrics-table.html).
