#### 15.6.3.8 优化 Linux 上的表空间分配

[](<>)

从 MySQL 8.0.22 开始，您可以优化如何`InnoDB`在 Linux 上为每表文件和通用表空间分配空间。默认情况下，当需要额外空间时，`InnoDB`将页面分配给表空间并将 NULL 物理写入这些页面。如果频繁分配新页面，此行为可能会影响性能。从 MySQL 8.0.22 开始，您可以禁用[`innodb_extend_and_initialize`](innodb-parameters.html#sysvar_innodb_extend_and_initialize)在 Linux 系统上避免物理地将 NULL 写入新分配的表空间页面。什么时候[`innodb_extend_and_initialize`](innodb-parameters.html#sysvar_innodb_extend_and_initialize)被禁用，空间分配给表空间文件使用`posix_fallocate()`调用，它保留空间而无需物理写入 NULL。

当使用分配页面时`posix_fallocate()`调用时，默认情况下扩展大小很小，并且通常一次只分配几个页面，这可能会导致碎片并增加随机 I/O。为避免此问题，请在启用时增加表空间扩展大小`posix_fallocate()`来电。表空间扩展大小可以使用`AUTOEXTEND_SIZE`选项。有关详细信息，请参阅[第 15.6.3.9 节，“表空间自动扩展\_尺寸配置”](innodb-tablespace-autoextend-size.html).

`InnoDB`在分配新的表空间页面之前写入重做日志记录。如果页面分配操作被中断，则在恢复期间从重做日志记录中重放该操作。（从重做日志记录重放的页分配操作将 NULL 物理写入新分配的页。）重做日志记录在分配页之前写入，而不管[`innodb_extend_and_initialize`](innodb-parameters.html#sysvar_innodb_extend_and_initialize)环境。

在非 Linux 系统和 Windows 上，`InnoDB`将新页面分配给表空间并将 NULL 物理写入这些页面，这是默认行为。尝试禁用[`innodb_extend_and_initialize`](innodb-parameters.html#sysvar_innodb_extend_and_initialize)在这些系统上返回以下错误：

改变innodb\_延长\_和\_此平台不支持初始化。回退到默认值。
