17.8.11 Настройка порога слияния страниц индекса
Вы можете настроить значение MERGE_THRESHOLD для страниц индекса. Если процент заполнения страницы “page-full” для страницы индекса опускается ниже значения MERGE_THRESHOLD при удалении строки или сокращении строки операцией UPDATE, InnoDB пытается слить страницу индекса с соседней страницей индекса. Значение по умолчанию для MERGE_THRESHOLD равно 50, что является ранее заданным значением. Минимальное значение для MERGE_THRESHOLD — 1, а максимальное — 50.
Когда процент заполнения страницы “page-full” для страницы индекса опускается ниже 50%, что является значением по умолчанию для MERGE_THRESHOLD, InnoDB пытается слить страницу индекса с соседней страницей. Если обе страницы близки к заполнению на 50%, вскоре после слияния страниц может произойти разделение страницы. Если такое поведение слияния-разделения происходит часто, это может негативно сказаться на производительности. Чтобы избежать частых слияний-разделений, вы можете уменьшить значение MERGE_THRESHOLD, чтобы InnoDB пыталась выполнить слияние страниц при более низком проценте заполнения “page-full”. Слияние страниц при более низком проценте заполнения оставляет больше места на страницах индекса и помогает уменьшить поведение слияния-разделения.
Значение MERGE_THRESHOLD для страниц индекса может быть определено для таблицы или для отдельных индексов. Значение MERGE_THRESHOLD, определенное для отдельного индекса, имеет приоритет над значением MERGE_THRESHOLD, определенным для таблицы. Если значение не определено, значение MERGE_THRESHOLD по умолчанию равно 50.
Настройка MERGE_THRESHOLD для таблицы
Вы можете установить значение MERGE_THRESHOLD для таблицы, используя предложение table_option COMMENT оператора CREATE TABLE. Например:
CREATE TABLE t1 (
id INT,
KEY id_index (id)
) COMMENT='MERGE_THRESHOLD=45';
Вы также можете установить значение MERGE_THRESHOLD для существующей таблицы, используя предложение table_option COMMENT с ALTER TABLE:
CREATE TABLE t1 (
id INT,
KEY id_index (id)
);
ALTER TABLE t1 COMMENT='MERGE_THRESHOLD=40';
Настройка MERGE_THRESHOLD для отдельных индексов
Чтобы установить значение MERGE_THRESHOLD для отдельного индекса, вы можете использовать предложение index_option COMMENT с CREATE TABLE, ALTER TABLE или CREATE INDEX, как показано в следующих примерах:
-
Настройка
MERGE_THRESHOLDдля отдельного индекса с помощьюCREATE TABLE:CREATE TABLE t1 ( id INT, KEY id_index (id) COMMENT 'MERGE_THRESHOLD=40' );
-
Настройка
MERGE_THRESHOLDдля отдельного индекса с помощьюALTER TABLE: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: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_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
Вы можете использовать SHOW CREATE TABLE, чтобы просмотреть значение MERGE_THRESHOLD для таблицы, если оно явно определено с помощью предложения table_option COMMENT:
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 COLLATE=utf8mb4_0900_ai_ci
Значение MERGE_THRESHOLD, определенное на уровне индекса, имеет приоритет над значением MERGE_THRESHOLD, определенным для таблицы. Если оно не определено, MERGE_THRESHOLD по умолчанию равно 50% (MERGE_THRESHOLD=50, что является ранее заданным значением).
Аналогично, вы можете использовать SHOW INDEX, чтобы просмотреть значение MERGE_THRESHOLD для индекса, если оно явно определено с помощью предложения index_option COMMENT:
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 может привести к большим файлам данных из-за чрезмерного количества пустого места на страницах.
Сведения об использовании счетчиков INNODB_METRICS см. в разделе 17.15.6, «Таблица InnoDB INFORMATION_SCHEMA Metrics».
© 2025 Oracle
Licensed under the GPLv2 License.