从 MySQL 8.0.22 开始,您可以优化如何InnoDB
在 Linux 上为 file-per-table 和通用表空间分配空间。默认情况下,当需要额外空间时,
InnoDB
将页面分配给表空间并向这些页面物理写入 NULL。如果频繁分配新页面,此行为会影响性能。从 MySQL 8.0.22 开始,您可以
innodb_extend_and_initialize
在 Linux 系统上禁用以避免将 NULL 物理写入新分配的表空间页面。禁用时
innodb_extend_and_initialize
,将使用调用将空间分配给表空间文件
posix_fallocate()
,这会保留空间而无需实际写入 NULL。
当使用
posix_fallocate()
调用分配页面时,默认情况下扩展大小很小,并且一次通常只分配几个页面,这会导致碎片并增加随机 I/O。为避免此问题,请在启用posix_fallocate()
调用时增加表空间扩展大小。AUTOEXTEND_SIZE
使用该选项可以将表空间扩展大小增加到 4GB
。有关详细信息,请参阅第 15.6.3.9 节,“表空间 AUTOEXTEND_SIZE 配置”。
InnoDB
在分配新的表空间页面之前写入重做日志记录。如果页面分配操作被中断,则在恢复期间从重做日志记录中重播该操作。(从重做日志记录重放的页面分配操作实际上将 NULL 写入新分配的页面。)无论innodb_extend_and_initialize
设置如何,重做日志记录都是在分配页面之前写入的。
在非 Linux 系统和 Windows 上,InnoDB
将新页面分配给表空间并将 NULL 物理写入这些页面,这是默认行为。尝试
innodb_extend_and_initialize
在这些系统上禁用会返回以下错误:
此平台不支持更改 innodb_extend_and_initialize。回退到默认值。