MDEV-37482: Introduce innodb_adaptive_hash_index_cells

SET GLOBAL innodb_adaptive_hash_index_cells may be executed
while the server is running. This parameter will be effectively
multiplied by innodb_adaptive_hash_index_parts, because each partition will
contain its own hash table.

Previously, the number of hash table cells in the InnoDB adaptive hash index
depended on the initial innodb_buffer_pool_size and was insufficient
for some workloads, leading to excessively long hash bucket chains.
If innodb_adaptive_hash_index_cells is at its minimum and default value
16381 at startup, it will be derived from the innodb_buffer_pool_size,
for backward compatibility.
This commit is contained in:
Marko Mäkelä 2025-09-30 10:15:09 +03:00
commit 3cc9ac0b30
7 changed files with 174 additions and 75 deletions

View file

@ -19,6 +19,8 @@ DROP TEMPORARY TABLE t;
#
SET @save_ahi = @@global.innodb_adaptive_hash_index;
SET GLOBAL innodb_adaptive_hash_index = 1;
SET @save_ahi_cells = @@global.innodb_adaptive_hash_index_cells;
SET GLOBAL innodb_adaptive_hash_index_cells=1048576;
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
SET @old_bulk_op=
(SELECT variable_value FROM information_schema.global_status
@ -43,6 +45,7 @@ INSERT INTO t1 SELECT * FROM seq_1_to_500;
ROLLBACK;
DROP TABLE t1;
SET GLOBAL innodb_adaptive_hash_index = @save_ahi;
SET GLOBAL innodb_adaptive_hash_index_cells = @save_ahi_cells;
#
# MDEV-24951 Assertion m.first->second.valid(trx->undo_no) failed
# in trx_undo_report_row_operation

View file

@ -25,6 +25,8 @@ DROP TEMPORARY TABLE t;
--echo #
SET @save_ahi = @@global.innodb_adaptive_hash_index;
SET GLOBAL innodb_adaptive_hash_index = 1;
SET @save_ahi_cells = @@global.innodb_adaptive_hash_index_cells;
SET GLOBAL innodb_adaptive_hash_index_cells=1048576;
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
SET @old_bulk_op=
@ -49,6 +51,7 @@ INSERT INTO t1 SELECT * FROM seq_1_to_500;
ROLLBACK;
DROP TABLE t1;
SET GLOBAL innodb_adaptive_hash_index = @save_ahi;
SET GLOBAL innodb_adaptive_hash_index_cells = @save_ahi_cells;
--echo #
--echo # MDEV-24951 Assertion m.first->second.valid(trx->undo_no) failed

View file

@ -1,6 +1,15 @@
--- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
@@ -47,7 +47,7 @@
@@ -51,7 +51,7 @@
VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Number of adaptive hash table cells in each partition; 16381 at start defaults to being derived from innodb_buffer_pool_size
NUMERIC_MIN_VALUE 16381
-NUMERIC_MAX_VALUE 4294967295
+NUMERIC_MAX_VALUE 1073741823
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
@@ -60,7 +60,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 8
VARIABLE_SCOPE GLOBAL
@ -9,7 +18,7 @@
VARIABLE_COMMENT Number of InnoDB Adaptive Hash Index Partitions (default 8)
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 512
@@ -83,7 +83,7 @@
@@ -96,7 +96,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 1
VARIABLE_SCOPE GLOBAL
@ -18,7 +27,7 @@
VARIABLE_COMMENT The AUTOINC lock modes supported by InnoDB: 0 => Old style AUTOINC locking (for backward compatibility); 1 => New style AUTOINC locking; 2 => No AUTOINC locking (unsafe for SBR)
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 2
@@ -95,10 +95,10 @@
@@ -108,10 +108,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@ -31,7 +40,7 @@
NUMERIC_BLOCK_SIZE 1048576
ENUM_VALUE_LIST NULL
READ_ONLY YES
@@ -131,7 +131,7 @@
@@ -144,7 +144,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 25
VARIABLE_SCOPE GLOBAL
@ -40,7 +49,7 @@
VARIABLE_COMMENT Dump only the hottest N% of each buffer pool, defaults to 25
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 100
@@ -203,10 +203,10 @@
@@ -216,10 +216,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 134217728
VARIABLE_SCOPE GLOBAL
@ -53,7 +62,7 @@
NUMERIC_BLOCK_SIZE 1048576
ENUM_VALUE_LIST NULL
READ_ONLY NO
@@ -215,11 +215,11 @@
@@ -228,11 +228,11 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@ -68,7 +77,7 @@
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
@@ -227,11 +227,11 @@
@@ -240,11 +240,11 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@ -83,7 +92,7 @@
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
@@ -239,7 +239,7 @@
@@ -252,7 +252,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@ -92,7 +101,7 @@
VARIABLE_COMMENT A number that tells how often buffer pool dump status in percentages should be printed. E.g. 10 means that buffer pool dump status is printed when every 10% of number of buffer pool pages are dumped. Default is 0 (only start and end status is printed)
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 100
@@ -311,7 +311,7 @@
@@ -324,7 +324,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 5
VARIABLE_SCOPE GLOBAL
@ -101,7 +110,7 @@
VARIABLE_COMMENT If the compression failure rate of a table is greater than this number more padding is added to the pages to reduce the failures. A value of zero implies no padding
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 100
@@ -335,7 +335,7 @@
@@ -348,7 +348,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 50
VARIABLE_SCOPE GLOBAL
@ -110,7 +119,7 @@
VARIABLE_COMMENT Percentage of empty space on a data page that can be reserved to make the page compressible
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 75
@@ -575,7 +575,7 @@
@@ -588,7 +588,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 600
VARIABLE_SCOPE GLOBAL
@ -119,7 +128,7 @@
VARIABLE_COMMENT Maximum number of seconds that semaphore times out in InnoDB
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 4294967295
@@ -623,7 +623,7 @@
@@ -636,7 +636,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 30
VARIABLE_SCOPE GLOBAL
@ -128,7 +137,7 @@
VARIABLE_COMMENT Number of iterations over which the background flushing is averaged
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 1000
@@ -647,7 +647,7 @@
@@ -660,7 +660,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 1
VARIABLE_SCOPE GLOBAL
@ -137,7 +146,7 @@
VARIABLE_COMMENT Controls the durability/speed trade-off for commits. Set to 0 (write and flush redo log to disk only once per second), 1 (flush to disk at each commit), 2 (write to log at commit but flush to disk only once per second) or 3 (flush to disk at prepare and at commit, slower and usually redundant). 1 and 3 guarantees that after a crash, committed transactions will not be lost and will be consistent with the binlog and other transactional engines. 2 can get inconsistent and lose transactions if there is a power failure or kernel crash but not if mysqld crashes. 0 has no guarantees in case of crash. 0 and 2 can be faster than 1 or 3
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 3
@@ -671,7 +671,7 @@
@@ -684,7 +684,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 1
VARIABLE_SCOPE GLOBAL
@ -146,7 +155,7 @@
VARIABLE_COMMENT Set to 0 (don't flush neighbors from buffer pool), 1 (flush contiguous neighbors from buffer pool) or 2 (flush neighbors from buffer pool), when flushing a block
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 2
@@ -707,7 +707,7 @@
@@ -720,7 +720,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@ -155,7 +164,7 @@
VARIABLE_COMMENT Helps to save your data in case the disk image of the database becomes corrupt. Value 5 can return bogus data, and 6 can permanently corrupt data
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 6
@@ -731,10 +731,10 @@
@@ -744,10 +744,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 8000000
VARIABLE_SCOPE GLOBAL
@ -168,7 +177,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
@@ -767,7 +767,7 @@
@@ -780,7 +780,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 84
VARIABLE_SCOPE GLOBAL
@ -177,7 +186,7 @@
VARIABLE_COMMENT InnoDB Fulltext search maximum token size in characters
NUMERIC_MIN_VALUE 10
NUMERIC_MAX_VALUE 84
@@ -779,7 +779,7 @@
@@ -792,7 +792,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 3
VARIABLE_SCOPE GLOBAL
@ -186,7 +195,7 @@
VARIABLE_COMMENT InnoDB Fulltext search minimum token size in characters
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 16
@@ -791,7 +791,7 @@
@@ -804,7 +804,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 2000
VARIABLE_SCOPE GLOBAL
@ -195,7 +204,7 @@
VARIABLE_COMMENT InnoDB Fulltext search number of words to optimize for each optimize table call
NUMERIC_MIN_VALUE 1000
NUMERIC_MAX_VALUE 10000
@@ -803,10 +803,10 @@
@@ -816,10 +816,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 2000000000
VARIABLE_SCOPE GLOBAL
@ -208,7 +217,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
@@ -827,7 +827,7 @@
@@ -840,7 +840,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 2
VARIABLE_SCOPE GLOBAL
@ -217,7 +226,7 @@
VARIABLE_COMMENT InnoDB Fulltext search parallel sort degree, will round up to nearest power of 2 number
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 16
@@ -839,10 +839,10 @@
@@ -852,10 +852,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 640000000
VARIABLE_SCOPE GLOBAL
@ -230,7 +239,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
@@ -887,7 +887,7 @@
@@ -900,7 +900,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 200
VARIABLE_SCOPE GLOBAL
@ -239,7 +248,7 @@
VARIABLE_COMMENT Number of IOPs the server can do. Tunes the background IO rate
NUMERIC_MIN_VALUE 100
NUMERIC_MAX_VALUE 4294967295
@@ -899,7 +899,7 @@
@@ -912,7 +912,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 4294967295
VARIABLE_SCOPE GLOBAL
@ -248,7 +257,7 @@
VARIABLE_COMMENT Limit to which innodb_io_capacity can be inflated
NUMERIC_MIN_VALUE 100
NUMERIC_MAX_VALUE 4294967295
@@ -1031,10 +1031,10 @@
@@ -1044,10 +1044,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 32
VARIABLE_SCOPE GLOBAL
@ -261,7 +270,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
@@ -1043,10 +1043,10 @@
@@ -1056,10 +1056,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 1536
VARIABLE_SCOPE GLOBAL
@ -274,7 +283,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
@@ -1079,10 +1079,10 @@
@@ -1092,10 +1092,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@ -287,7 +296,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
@@ -1091,7 +1091,7 @@
@@ -1104,7 +1104,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@ -296,7 +305,7 @@
VARIABLE_COMMENT Maximum delay of user threads in micro-seconds
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 10000000
@@ -1223,10 +1223,10 @@
@@ -1236,10 +1236,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
@ -309,7 +318,7 @@
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY YES
@@ -1247,7 +1247,7 @@
@@ -1260,7 +1260,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 16384
VARIABLE_SCOPE GLOBAL
@ -318,7 +327,7 @@
VARIABLE_COMMENT Page size to use for all InnoDB tablespaces
NUMERIC_MIN_VALUE 4096
NUMERIC_MAX_VALUE 65536
@@ -1283,7 +1283,7 @@
@@ -1296,7 +1296,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 127
VARIABLE_SCOPE GLOBAL
@ -327,7 +336,7 @@
VARIABLE_COMMENT Number of UNDO log pages to purge in one batch from the history list
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 5000
@@ -1295,7 +1295,7 @@
@@ -1308,7 +1308,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 128
VARIABLE_SCOPE GLOBAL
@ -336,7 +345,7 @@
VARIABLE_COMMENT Unused
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 128
@@ -1331,7 +1331,7 @@
@@ -1344,7 +1344,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 56
VARIABLE_SCOPE GLOBAL
@ -345,7 +354,7 @@
VARIABLE_COMMENT Number of pages that must be accessed sequentially for InnoDB to trigger a readahead
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 64
@@ -1415,7 +1415,7 @@
@@ -1428,7 +1428,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 1048576
VARIABLE_SCOPE GLOBAL
@ -354,7 +363,7 @@
VARIABLE_COMMENT Memory buffer size for index creation
NUMERIC_MIN_VALUE 65536
NUMERIC_MAX_VALUE 67108864
@@ -1583,10 +1583,10 @@
@@ -1596,10 +1596,10 @@
SESSION_VALUE NULL
DEFAULT_VALUE 30
VARIABLE_SCOPE GLOBAL

View file

@ -44,6 +44,18 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST OFF,ON
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME INNODB_ADAPTIVE_HASH_INDEX_CELLS
SESSION_VALUE NULL
DEFAULT_VALUE 16381
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Number of adaptive hash table cells in each partition; 16381 at start defaults to being derived from innodb_buffer_pool_size
NUMERIC_MIN_VALUE 16381
NUMERIC_MAX_VALUE 4294967295
NUMERIC_BLOCK_SIZE 0
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME INNODB_ADAPTIVE_HASH_INDEX_PARTS
SESSION_VALUE NULL
DEFAULT_VALUE 8