MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  インデックスページのマージしきい値の構成

15.8.11 インデックスページのマージしきい値の構成

インデックスページの MERGE_THRESHOLD 値を構成できます。 行が削除されたとき、または UPDATE 操作によって行が短縮されたときに、インデックスページの page-full 割合が MERGE_THRESHOLD 値を下回った場合、InnoDB はインデックスページを隣接するインデックスページとマージしようとします。 デフォルトの MERGE_THRESHOLD 値は 50 で、これは以前にハードコードされた値です。 MERGE_THRESHOLD の最小値は 1 で、最大値は 50 です。

インデックスページの page-full 割合がデフォルトの MERGE_THRESHOLD 設定である 50% を下回ると、InnoDB はインデックスページを隣接するページとマージしようとします。 両方のページが 50% に近い場合、ページがマージされた直後にページ分割が発生する可能性があります。 このマージ分割動作が頻繁に発生する場合は、パフォーマンスに悪影響を与える可能性があります。 頻繁なマージスプリットを回避するには、InnoDBpage-full の低い割合でページマージを試行するように、MERGE_THRESHOLD 値を小さくします。 ページフルの割合が低いページをマージすると、インデックスページの空き領域が増え、マージ分割の動作を減らすことができます。

インデックスページ用の 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 TABLEtable_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 TABLEALTER TABLE または CREATE INDEXindex_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 値を変更することはできません。これは、InnoDB テーブルが主キーまたは一意キーインデックスなしで作成されたときに InnoDB によって作成されるクラスタインデックスです。 GEN_CLUST_INDEXMERGE_THRESHOLD 値は、テーブルに MERGE_THRESHOLD を設定することによってのみ変更できます。

インデックスの MERGE_THRESHOLD 値のクエリー

インデックスの現在の MERGE_THRESHOLD 値は、INNODB_INDEXES テーブルをクエリーすることで取得できます。 例:

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

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=utf8mb4
注記

インデックスレベルで定義された 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 設定の影響を測定するために使用できる 2 つのカウンタが用意されています。

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 カウンタの使用の詳細は、セクション15.15.6「InnoDB INFORMATION_SCHEMA メトリックテーブル」 を参照してください。


関連キーワード:  InnoDB, テーブル, MERGE, THRESHOLD, インデックス, ページ, 構成, TABLE, 設定, マージ