Skip to content

Commit 3cc9ac0

Browse files
committed
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.
1 parent 9654b81 commit 3cc9ac0

File tree

7 files changed

+174
-75
lines changed

7 files changed

+174
-75
lines changed

mysql-test/suite/innodb/r/insert_into_empty.result

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ DROP TEMPORARY TABLE t;
1919
#
2020
SET @save_ahi = @@global.innodb_adaptive_hash_index;
2121
SET GLOBAL innodb_adaptive_hash_index = 1;
22+
SET @save_ahi_cells = @@global.innodb_adaptive_hash_index_cells;
23+
SET GLOBAL innodb_adaptive_hash_index_cells=1048576;
2224
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
2325
SET @old_bulk_op=
2426
(SELECT variable_value FROM information_schema.global_status
@@ -43,6 +45,7 @@ INSERT INTO t1 SELECT * FROM seq_1_to_500;
4345
ROLLBACK;
4446
DROP TABLE t1;
4547
SET GLOBAL innodb_adaptive_hash_index = @save_ahi;
48+
SET GLOBAL innodb_adaptive_hash_index_cells = @save_ahi_cells;
4649
#
4750
# MDEV-24951 Assertion m.first->second.valid(trx->undo_no) failed
4851
# in trx_undo_report_row_operation

mysql-test/suite/innodb/t/insert_into_empty.test

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ DROP TEMPORARY TABLE t;
2525
--echo #
2626
SET @save_ahi = @@global.innodb_adaptive_hash_index;
2727
SET GLOBAL innodb_adaptive_hash_index = 1;
28+
SET @save_ahi_cells = @@global.innodb_adaptive_hash_index_cells;
29+
SET GLOBAL innodb_adaptive_hash_index_cells=1048576;
2830
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
2931

3032
SET @old_bulk_op=
@@ -49,6 +51,7 @@ INSERT INTO t1 SELECT * FROM seq_1_to_500;
4951
ROLLBACK;
5052
DROP TABLE t1;
5153
SET GLOBAL innodb_adaptive_hash_index = @save_ahi;
54+
SET GLOBAL innodb_adaptive_hash_index_cells = @save_ahi_cells;
5255

5356
--echo #
5457
--echo # MDEV-24951 Assertion m.first->second.valid(trx->undo_no) failed

mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
--- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result
22
+++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result
3-
@@ -47,7 +47,7 @@
3+
@@ -51,7 +51,7 @@
4+
VARIABLE_TYPE INT UNSIGNED
5+
VARIABLE_COMMENT Number of adaptive hash table cells in each partition; 16381 at start defaults to being derived from innodb_buffer_pool_size
6+
NUMERIC_MIN_VALUE 16381
7+
-NUMERIC_MAX_VALUE 4294967295
8+
+NUMERIC_MAX_VALUE 1073741823
9+
NUMERIC_BLOCK_SIZE 0
10+
ENUM_VALUE_LIST NULL
11+
READ_ONLY NO
12+
@@ -60,7 +60,7 @@
413
SESSION_VALUE NULL
514
DEFAULT_VALUE 8
615
VARIABLE_SCOPE GLOBAL
@@ -9,7 +18,7 @@
918
VARIABLE_COMMENT Number of InnoDB Adaptive Hash Index Partitions (default 8)
1019
NUMERIC_MIN_VALUE 1
1120
NUMERIC_MAX_VALUE 512
12-
@@ -83,7 +83,7 @@
21+
@@ -96,7 +96,7 @@
1322
SESSION_VALUE NULL
1423
DEFAULT_VALUE 1
1524
VARIABLE_SCOPE GLOBAL
@@ -18,7 +27,7 @@
1827
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)
1928
NUMERIC_MIN_VALUE 0
2029
NUMERIC_MAX_VALUE 2
21-
@@ -95,10 +95,10 @@
30+
@@ -108,10 +108,10 @@
2231
SESSION_VALUE NULL
2332
DEFAULT_VALUE 0
2433
VARIABLE_SCOPE GLOBAL
@@ -31,7 +40,7 @@
3140
NUMERIC_BLOCK_SIZE 1048576
3241
ENUM_VALUE_LIST NULL
3342
READ_ONLY YES
34-
@@ -131,7 +131,7 @@
43+
@@ -144,7 +144,7 @@
3544
SESSION_VALUE NULL
3645
DEFAULT_VALUE 25
3746
VARIABLE_SCOPE GLOBAL
@@ -40,7 +49,7 @@
4049
VARIABLE_COMMENT Dump only the hottest N% of each buffer pool, defaults to 25
4150
NUMERIC_MIN_VALUE 1
4251
NUMERIC_MAX_VALUE 100
43-
@@ -203,10 +203,10 @@
52+
@@ -216,10 +216,10 @@
4453
SESSION_VALUE NULL
4554
DEFAULT_VALUE 134217728
4655
VARIABLE_SCOPE GLOBAL
@@ -53,7 +62,7 @@
5362
NUMERIC_BLOCK_SIZE 1048576
5463
ENUM_VALUE_LIST NULL
5564
READ_ONLY NO
56-
@@ -215,11 +215,11 @@
65+
@@ -228,11 +228,11 @@
5766
SESSION_VALUE NULL
5867
DEFAULT_VALUE 0
5968
VARIABLE_SCOPE GLOBAL
@@ -68,7 +77,7 @@
6877
ENUM_VALUE_LIST NULL
6978
READ_ONLY NO
7079
COMMAND_LINE_ARGUMENT REQUIRED
71-
@@ -227,11 +227,11 @@
80+
@@ -240,11 +240,11 @@
7281
SESSION_VALUE NULL
7382
DEFAULT_VALUE 0
7483
VARIABLE_SCOPE GLOBAL
@@ -83,7 +92,7 @@
8392
ENUM_VALUE_LIST NULL
8493
READ_ONLY YES
8594
COMMAND_LINE_ARGUMENT REQUIRED
86-
@@ -239,7 +239,7 @@
95+
@@ -252,7 +252,7 @@
8796
SESSION_VALUE NULL
8897
DEFAULT_VALUE 0
8998
VARIABLE_SCOPE GLOBAL
@@ -92,7 +101,7 @@
92101
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)
93102
NUMERIC_MIN_VALUE 0
94103
NUMERIC_MAX_VALUE 100
95-
@@ -311,7 +311,7 @@
104+
@@ -324,7 +324,7 @@
96105
SESSION_VALUE NULL
97106
DEFAULT_VALUE 5
98107
VARIABLE_SCOPE GLOBAL
@@ -101,7 +110,7 @@
101110
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
102111
NUMERIC_MIN_VALUE 0
103112
NUMERIC_MAX_VALUE 100
104-
@@ -335,7 +335,7 @@
113+
@@ -348,7 +348,7 @@
105114
SESSION_VALUE NULL
106115
DEFAULT_VALUE 50
107116
VARIABLE_SCOPE GLOBAL
@@ -110,7 +119,7 @@
110119
VARIABLE_COMMENT Percentage of empty space on a data page that can be reserved to make the page compressible
111120
NUMERIC_MIN_VALUE 0
112121
NUMERIC_MAX_VALUE 75
113-
@@ -575,7 +575,7 @@
122+
@@ -588,7 +588,7 @@
114123
SESSION_VALUE NULL
115124
DEFAULT_VALUE 600
116125
VARIABLE_SCOPE GLOBAL
@@ -119,7 +128,7 @@
119128
VARIABLE_COMMENT Maximum number of seconds that semaphore times out in InnoDB
120129
NUMERIC_MIN_VALUE 1
121130
NUMERIC_MAX_VALUE 4294967295
122-
@@ -623,7 +623,7 @@
131+
@@ -636,7 +636,7 @@
123132
SESSION_VALUE NULL
124133
DEFAULT_VALUE 30
125134
VARIABLE_SCOPE GLOBAL
@@ -128,7 +137,7 @@
128137
VARIABLE_COMMENT Number of iterations over which the background flushing is averaged
129138
NUMERIC_MIN_VALUE 1
130139
NUMERIC_MAX_VALUE 1000
131-
@@ -647,7 +647,7 @@
140+
@@ -660,7 +660,7 @@
132141
SESSION_VALUE NULL
133142
DEFAULT_VALUE 1
134143
VARIABLE_SCOPE GLOBAL
@@ -137,7 +146,7 @@
137146
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
138147
NUMERIC_MIN_VALUE 0
139148
NUMERIC_MAX_VALUE 3
140-
@@ -671,7 +671,7 @@
149+
@@ -684,7 +684,7 @@
141150
SESSION_VALUE NULL
142151
DEFAULT_VALUE 1
143152
VARIABLE_SCOPE GLOBAL
@@ -146,7 +155,7 @@
146155
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
147156
NUMERIC_MIN_VALUE 0
148157
NUMERIC_MAX_VALUE 2
149-
@@ -707,7 +707,7 @@
158+
@@ -720,7 +720,7 @@
150159
SESSION_VALUE NULL
151160
DEFAULT_VALUE 0
152161
VARIABLE_SCOPE GLOBAL
@@ -155,7 +164,7 @@
155164
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
156165
NUMERIC_MIN_VALUE 0
157166
NUMERIC_MAX_VALUE 6
158-
@@ -731,10 +731,10 @@
167+
@@ -744,10 +744,10 @@
159168
SESSION_VALUE NULL
160169
DEFAULT_VALUE 8000000
161170
VARIABLE_SCOPE GLOBAL
@@ -168,7 +177,7 @@
168177
NUMERIC_BLOCK_SIZE 0
169178
ENUM_VALUE_LIST NULL
170179
READ_ONLY NO
171-
@@ -767,7 +767,7 @@
180+
@@ -780,7 +780,7 @@
172181
SESSION_VALUE NULL
173182
DEFAULT_VALUE 84
174183
VARIABLE_SCOPE GLOBAL
@@ -177,7 +186,7 @@
177186
VARIABLE_COMMENT InnoDB Fulltext search maximum token size in characters
178187
NUMERIC_MIN_VALUE 10
179188
NUMERIC_MAX_VALUE 84
180-
@@ -779,7 +779,7 @@
189+
@@ -792,7 +792,7 @@
181190
SESSION_VALUE NULL
182191
DEFAULT_VALUE 3
183192
VARIABLE_SCOPE GLOBAL
@@ -186,7 +195,7 @@
186195
VARIABLE_COMMENT InnoDB Fulltext search minimum token size in characters
187196
NUMERIC_MIN_VALUE 0
188197
NUMERIC_MAX_VALUE 16
189-
@@ -791,7 +791,7 @@
198+
@@ -804,7 +804,7 @@
190199
SESSION_VALUE NULL
191200
DEFAULT_VALUE 2000
192201
VARIABLE_SCOPE GLOBAL
@@ -195,7 +204,7 @@
195204
VARIABLE_COMMENT InnoDB Fulltext search number of words to optimize for each optimize table call
196205
NUMERIC_MIN_VALUE 1000
197206
NUMERIC_MAX_VALUE 10000
198-
@@ -803,10 +803,10 @@
207+
@@ -816,10 +816,10 @@
199208
SESSION_VALUE NULL
200209
DEFAULT_VALUE 2000000000
201210
VARIABLE_SCOPE GLOBAL
@@ -208,7 +217,7 @@
208217
NUMERIC_BLOCK_SIZE 0
209218
ENUM_VALUE_LIST NULL
210219
READ_ONLY NO
211-
@@ -827,7 +827,7 @@
220+
@@ -840,7 +840,7 @@
212221
SESSION_VALUE NULL
213222
DEFAULT_VALUE 2
214223
VARIABLE_SCOPE GLOBAL
@@ -217,7 +226,7 @@
217226
VARIABLE_COMMENT InnoDB Fulltext search parallel sort degree, will round up to nearest power of 2 number
218227
NUMERIC_MIN_VALUE 1
219228
NUMERIC_MAX_VALUE 16
220-
@@ -839,10 +839,10 @@
229+
@@ -852,10 +852,10 @@
221230
SESSION_VALUE NULL
222231
DEFAULT_VALUE 640000000
223232
VARIABLE_SCOPE GLOBAL
@@ -230,7 +239,7 @@
230239
NUMERIC_BLOCK_SIZE 0
231240
ENUM_VALUE_LIST NULL
232241
READ_ONLY NO
233-
@@ -887,7 +887,7 @@
242+
@@ -900,7 +900,7 @@
234243
SESSION_VALUE NULL
235244
DEFAULT_VALUE 200
236245
VARIABLE_SCOPE GLOBAL
@@ -239,7 +248,7 @@
239248
VARIABLE_COMMENT Number of IOPs the server can do. Tunes the background IO rate
240249
NUMERIC_MIN_VALUE 100
241250
NUMERIC_MAX_VALUE 4294967295
242-
@@ -899,7 +899,7 @@
251+
@@ -912,7 +912,7 @@
243252
SESSION_VALUE NULL
244253
DEFAULT_VALUE 4294967295
245254
VARIABLE_SCOPE GLOBAL
@@ -248,7 +257,7 @@
248257
VARIABLE_COMMENT Limit to which innodb_io_capacity can be inflated
249258
NUMERIC_MIN_VALUE 100
250259
NUMERIC_MAX_VALUE 4294967295
251-
@@ -1031,10 +1031,10 @@
260+
@@ -1044,10 +1044,10 @@
252261
SESSION_VALUE NULL
253262
DEFAULT_VALUE 32
254263
VARIABLE_SCOPE GLOBAL
@@ -261,7 +270,7 @@
261270
NUMERIC_BLOCK_SIZE 0
262271
ENUM_VALUE_LIST NULL
263272
READ_ONLY NO
264-
@@ -1043,10 +1043,10 @@
273+
@@ -1056,10 +1056,10 @@
265274
SESSION_VALUE NULL
266275
DEFAULT_VALUE 1536
267276
VARIABLE_SCOPE GLOBAL
@@ -274,7 +283,7 @@
274283
NUMERIC_BLOCK_SIZE 0
275284
ENUM_VALUE_LIST NULL
276285
READ_ONLY NO
277-
@@ -1079,10 +1079,10 @@
286+
@@ -1092,10 +1092,10 @@
278287
SESSION_VALUE NULL
279288
DEFAULT_VALUE 0
280289
VARIABLE_SCOPE GLOBAL
@@ -287,7 +296,7 @@
287296
NUMERIC_BLOCK_SIZE 0
288297
ENUM_VALUE_LIST NULL
289298
READ_ONLY NO
290-
@@ -1091,7 +1091,7 @@
299+
@@ -1104,7 +1104,7 @@
291300
SESSION_VALUE NULL
292301
DEFAULT_VALUE 0
293302
VARIABLE_SCOPE GLOBAL
@@ -296,7 +305,7 @@
296305
VARIABLE_COMMENT Maximum delay of user threads in micro-seconds
297306
NUMERIC_MIN_VALUE 0
298307
NUMERIC_MAX_VALUE 10000000
299-
@@ -1223,10 +1223,10 @@
308+
@@ -1236,10 +1236,10 @@
300309
SESSION_VALUE NULL
301310
DEFAULT_VALUE 0
302311
VARIABLE_SCOPE GLOBAL
@@ -309,7 +318,7 @@
309318
NUMERIC_BLOCK_SIZE 0
310319
ENUM_VALUE_LIST NULL
311320
READ_ONLY YES
312-
@@ -1247,7 +1247,7 @@
321+
@@ -1260,7 +1260,7 @@
313322
SESSION_VALUE NULL
314323
DEFAULT_VALUE 16384
315324
VARIABLE_SCOPE GLOBAL
@@ -318,7 +327,7 @@
318327
VARIABLE_COMMENT Page size to use for all InnoDB tablespaces
319328
NUMERIC_MIN_VALUE 4096
320329
NUMERIC_MAX_VALUE 65536
321-
@@ -1283,7 +1283,7 @@
330+
@@ -1296,7 +1296,7 @@
322331
SESSION_VALUE NULL
323332
DEFAULT_VALUE 127
324333
VARIABLE_SCOPE GLOBAL
@@ -327,7 +336,7 @@
327336
VARIABLE_COMMENT Number of UNDO log pages to purge in one batch from the history list
328337
NUMERIC_MIN_VALUE 1
329338
NUMERIC_MAX_VALUE 5000
330-
@@ -1295,7 +1295,7 @@
339+
@@ -1308,7 +1308,7 @@
331340
SESSION_VALUE NULL
332341
DEFAULT_VALUE 128
333342
VARIABLE_SCOPE GLOBAL
@@ -336,7 +345,7 @@
336345
VARIABLE_COMMENT Unused
337346
NUMERIC_MIN_VALUE 1
338347
NUMERIC_MAX_VALUE 128
339-
@@ -1331,7 +1331,7 @@
348+
@@ -1344,7 +1344,7 @@
340349
SESSION_VALUE NULL
341350
DEFAULT_VALUE 56
342351
VARIABLE_SCOPE GLOBAL
@@ -345,7 +354,7 @@
345354
VARIABLE_COMMENT Number of pages that must be accessed sequentially for InnoDB to trigger a readahead
346355
NUMERIC_MIN_VALUE 0
347356
NUMERIC_MAX_VALUE 64
348-
@@ -1415,7 +1415,7 @@
357+
@@ -1428,7 +1428,7 @@
349358
SESSION_VALUE NULL
350359
DEFAULT_VALUE 1048576
351360
VARIABLE_SCOPE GLOBAL
@@ -354,7 +363,7 @@
354363
VARIABLE_COMMENT Memory buffer size for index creation
355364
NUMERIC_MIN_VALUE 65536
356365
NUMERIC_MAX_VALUE 67108864
357-
@@ -1583,10 +1583,10 @@
366+
@@ -1596,10 +1596,10 @@
358367
SESSION_VALUE NULL
359368
DEFAULT_VALUE 30
360369
VARIABLE_SCOPE GLOBAL

mysql-test/suite/sys_vars/r/sysvars_innodb.result

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ NUMERIC_BLOCK_SIZE NULL
4444
ENUM_VALUE_LIST OFF,ON
4545
READ_ONLY NO
4646
COMMAND_LINE_ARGUMENT OPTIONAL
47+
VARIABLE_NAME INNODB_ADAPTIVE_HASH_INDEX_CELLS
48+
SESSION_VALUE NULL
49+
DEFAULT_VALUE 16381
50+
VARIABLE_SCOPE GLOBAL
51+
VARIABLE_TYPE INT UNSIGNED
52+
VARIABLE_COMMENT Number of adaptive hash table cells in each partition; 16381 at start defaults to being derived from innodb_buffer_pool_size
53+
NUMERIC_MIN_VALUE 16381
54+
NUMERIC_MAX_VALUE 4294967295
55+
NUMERIC_BLOCK_SIZE 0
56+
ENUM_VALUE_LIST NULL
57+
READ_ONLY NO
58+
COMMAND_LINE_ARGUMENT REQUIRED
4759
VARIABLE_NAME INNODB_ADAPTIVE_HASH_INDEX_PARTS
4860
SESSION_VALUE NULL
4961
DEFAULT_VALUE 8

0 commit comments

Comments
 (0)