## 15.12 InnoDB 和在线 DDL

[15.12.1 在线 DDL 操作](innodb-online-ddl-operations.html)
[15.12.2 在线 DDL 性能和并发](innodb-online-ddl-performance.html)
[15.12.3 在线 DDL 空间要求](innodb-online-ddl-space-requirements.html)
[15.12.4 在线 DDL 内存管理](online-ddl-memory-management.html)
[15.12.5 为在线 DDL 操作配置并行线程](online-ddl-parallel-thread-configuration.html)
[15.12.6 使用在线 DDL 简化 DDL 语句](innodb-online-ddl-single-multi.html)
[15.12.7 在线 DDL 失败情况](innodb-online-ddl-failure-conditions.html)
[15.12.8 在线 DDL 限制](innodb-online-ddl-limitations.html)

[](<>)[](<>)

在线 DDL 功能提供对即时和就地表更改和并发 DML 的支持。此功能的好处包括：

-   在繁忙的生产环境中提高响应能力和可用性，在这种情况下，让表在几分钟或几小时内不可用是不切实际的。

-   对于就地操作，在 DDL 操作期间使用`锁`条款。看[LOCK 子句](innodb-online-ddl-performance.html#innodb-online-ddl-locking-options).

-   比表复制方法更少的磁盘空间使用和 I/O 开销。

笔记

`算法=即时`支持可用于`添加列`以及 MySQL 8.0.12 中的其他操作。

通常，您无需执行任何特殊操作即可启用在线 DDL。默认情况下，MySQL 会在允许的情况下立即或就地执行操作，并尽可能少地锁定。

您可以使用`算法`和`锁`的条款[`更改表`](alter-table.html)陈述。这些子句放在语句的末尾，用逗号与表和列规范隔开。例如：

```
ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
```

这`锁`子句可用于就地执行的操作，对于微调操作期间对表的并发访问程度很有用。仅有的`锁定=默认`支持即时执行的操作。这`算法`子句主要用于性能比较，并作为旧表复制行为的后备，以防您遇到任何问题。例如：

-   为了避免在就地过程中意外地使表不可用于读取、写入或两者兼而有之[`更改表`](alter-table.html)操作，在[`更改表`](alter-table.html)声明如`锁定=无`（允许读写）或`锁定=共享`（许可读取）。如果请求的并发级别不可用，操作会立即停止。

-   要比较算法之间的性能，请运行以下语句`算法=即时`,`算法=就地`和`算法=复制`.您还可以使用[`old_alter_table`](server-system-variables.html#sysvar_old_alter_table)启用配置选项以强制使用`算法=复制`.

-   为了避免使用[`更改表`](alter-table.html)复制表的操作，包括`算法=即时`要么`算法=就地`.如果不能使用指定的算法，该语句将立即停止。
