WL#5757: InnoDB: Support Page Sizes 32k and 64k
Status: Complete
Support page sizes 32k and 64k, but don't support compression format. And we limit max record size to 16k.
Functional requirements: F-1: innodb_page_size should support 32k and 64k. F-2: Don't support compression format when innodb_page_size is 32k or 64k. F-3 : Keep 16k as the max record size when innodb-page-size is 32k or 64k Non-Functional requirements: NF-1: Implicit requirements: No new SQL needed, work on all platforms.
1. Set max value of innodb-page-size to 64k. 2. Handle 32k & 64k page size in file IO. 3. Increase extent size for 32k & 64k page size. 4096 8192 16384 32768 65536 extent size(bytes) 1M 1M 1M 2M 4M xdes size 88 56 40 40 40 N_EXTENTS 16 64 256 512 1024 xdes[0] start 150 150 150 150 150 xdes[N_EXTENTS] end 1568 3744 10400 20640 41120 XDES_SIZE = 24 + UT_BITS_IN_BYTES(extent_size / innodb_page_size * 2). N_EXTENTS = innodb_page_size * innodb_page_size / extent_size. If we do not enlarge the extent size, we will have too many extent headers on the bitmap page and the bitmap page will overflow. See compilation check & assert in "xdes_calc_descriptor_page". 4. Push warning if ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE are used in CREATE TABLE when innodb-page-size is 32k or 64k. 5. Keep 16k as the max record size when innodb-page-size is 64k, even we can support much bigger record size for row formats except REDUNDANT.
1. Set max value of innodb-page-size to 64k.
a. storage/innobase/include/univ.i
#define UNIV_PAGE_SIZE_SHIFT_MAX 16
b. storage/innobase/include/page0size.h
#define PAGE_SIZE_T_SIZE_BITS 17
2. Handle 32k & 64k page size in file IO.
storage/innobase/fil/fil0fil.cc
fil_io(
case 32768: size_shift = 15; break;
case 65536: size_shift = 16; break;
3. Increase extent size for 32k & 64k page size.
storage/innobase/include/fsp0types.h
/** File space extent size (one megabyte if default) in pages */
#define FSP_EXTENT_SIZE ((UNIV_PAGE_SIZE <= (1 << 14) ? \
(1048576U / UNIV_PAGE_SIZE) : \
((UNIV_PAGE_SIZE <= 1 << 15) ? \
(2097152U / UNIV_PAGE_SIZE) : \
(4194304U / UNIV_PAGE_SIZE))))
/** File space extent size (four megabyte) in pages for MAX page size */
#define FSP_EXTENT_SIZE_MAX (4194304U / UNIV_PAGE_SIZE_MAX)
4. Push warning if ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE are used in CREATE
TABLE when innodb-page-size is 32k or 64k.
a. storage/innobase/handler/ha_innodb.cc
innobase_table_flags
/* Don't support compressed table when page size > 16k. */
if (zip_allowed && zip_ssize && UNIV_PAGE_SIZE > UNIV_PAGE_SIZE_DEF) {
push_warning(thd, Sql_condition::SL_WARNING,
ER_ILLEGAL_HA_CREATE_OPTION,
"InnoDB: Cannot create a COMPRESSED table"
" when innodb_page_size > 16k.");
zip_allowed = FALSE;
}
b. storage/innobase/page/page0zip.cc
page_zip_dir_encode
#if PAGE_ZIP_DIR_SLOT_MASK < UNIV_PAGE_SIZE_DEF - 1
# error "PAGE_ZIP_DIR_SLOT_MASK < UNIV_PAGE_SIZE_DEF - 1"
#endif
5. Keep 16k as the max record size when innodb-page-size is 64k, even we can
support much bigger record size for row formats except REDUNDANT.
storage/innobase/btr/btr0cur.cc
btr_cur_optimistic_update
/* If the record size > 16k, we need to store it externally.*/
if (page_zip_rec_needs_ext(new_rec_size, page_is_comp(page),
dict_index_get_n_fields(index),
block->page.size)) {
goto any_extern;
}
6. Miscs
a. Set innodb_log_buffer_size default value from 8M to 16M.
b. storage/innobase/row/row0ftsort.cc
row_fts_merge_insert, change buf size from 16k to 64k.
Copyright (c) 2000, 2025, Oracle Corporation and/or its affiliates. All rights reserved.