インデックスページの MERGE_THRESHOLD
値を構成できます。 行が削除されたとき、または UPDATE
操作によって行が短縮されたときに、インデックスページの 「page-full」 割合が MERGE_THRESHOLD
値を下回った場合、InnoDB
はインデックスページを隣接するインデックスページとマージしようとします。 デフォルトの MERGE_THRESHOLD
値は 50 で、これは以前にハードコードされた値です。 MERGE_THRESHOLD
の最小値は 1 で、最大値は 50 です。
インデックスページの 「page-full」 割合がデフォルトの MERGE_THRESHOLD
設定である 50% を下回ると、InnoDB
はインデックスページを隣接するページとマージしようとします。 両方のページが 50% に近い場合、ページがマージされた直後にページ分割が発生する可能性があります。 このマージ分割動作が頻繁に発生する場合は、パフォーマンスに悪影響を与える可能性があります。 頻繁なマージスプリットを回避するには、InnoDB
が 「page-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 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
値を変更することはできません。これは、InnoDB
テーブルが主キーまたは一意キーインデックスなしで作成されたときに InnoDB
によって作成されるクラスタインデックスです。 GEN_CLUST_INDEX
の MERGE_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 メトリックテーブル」 を参照してください。