从 MySQL 5.6 开始,引入了 在线 DDL(Online DDL) 功能,允许在不锁定表或最小化锁定的情况下执行某些 DDL 操作。这大大提高了数据库的可用性和性能。以下是 MySQL 5.6 及以上版本支持的在线 DDL 操作:
1. 支持的在线 DDL 操作
(1) 添加列
- 语法:
ALTER TABLE table_name ADD COLUMN column_name column_definition;
- 支持版本:MySQL 5.6 及以上。
- 特点:
- 支持并发读写操作。
- 操作完成后,表结构立即生效。
(2) 删除列
- 语法:
ALTER TABLE table_name DROP COLUMN column_name;
- 支持版本:MySQL 5.6 及以上。
- 特点:
- 支持并发读写操作。
- 操作完成后,表结构立即生效。
(3) 修改列类型
- 语法:
ALTER TABLE table_name MODIFY COLUMN column_name new_column_definition;
- 支持版本:MySQL 5.6 及以上。
- 特点:
- 支持并发读写操作。
- 操作完成后,表结构立即生效。
(4) 添加索引
- 语法:
CREATE INDEX index_name ON table_name (column_name);
- 支持版本:MySQL 5.6 及以上。
- 特点:
- 支持并发读写操作。
- 操作完成后,索引立即生效。
(5) 删除索引
- 语法:
DROP INDEX index_name ON table_name;
- 支持版本:MySQL 5.6 及以上。
- 特点:
- 支持并发读写操作。
- 操作完成后,索引立即删除。
(6) 重命名表
- 语法:
ALTER TABLE table_name RENAME TO new_table_name;
- 支持版本:MySQL 5.6 及以上。
- 特点:
- 支持并发读写操作。
- 操作完成后,表名立即生效。
(7) 设置默认值
- 语法:
ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT default_value;
- 支持版本:MySQL 5.6 及以上。
- 特点:
- 支持并发读写操作。
- 操作完成后,默认值立即生效。
(8) 删除默认值
- 语法:
ALTER TABLE table_name ALTER COLUMN column_name DROP DEFAULT;
- 支持版本:MySQL 5.6 及以上。
- 特点:
- 支持并发读写操作。
- 操作完成后,默认值立即删除。
2. 在线 DDL 的特点
- 并发性:支持并发读写操作,减少对业务的影响。
- 原子性:操作完成后,表结构立即生效,无需重启数据库。
- 性能:相比传统 DDL,在线 DDL 的性能更高,尤其是在大表上操作时。
3. 注意事项
- 锁机制:虽然在线 DDL 支持并发读写,但在某些操作中仍可能短暂锁定表(如修改列类型)。
- 资源消耗:在线 DDL 操作可能会占用较多的 CPU 和 I/O 资源,建议在业务低峰期执行。
- 版本差异:不同版本的 MySQL 对在线 DDL 的支持程度有所不同,建议根据实际版本选择合适的操作。
4. 示例
(1) 添加列
ALTER TABLE users ADD COLUMN age INT;
(2) 删除列
ALTER TABLE users DROP COLUMN age;
(3) 修改列类型
ALTER TABLE users MODIFY COLUMN age BIGINT;
(4) 添加索引
CREATE INDEX idx_name ON users (name);
(5) 删除索引
DROP INDEX idx_name ON users;
(6) 重命名表
ALTER TABLE users RENAME TO customers;
(7) 设置默认值
ALTER TABLE users ALTER COLUMN age SET DEFAULT 18;
(8) 删除默认值
ALTER TABLE users ALTER COLUMN age DROP DEFAULT;
总结
MySQL 5.6 及以上版本支持多种在线 DDL 操作,包括添加列、删除列、修改列类型、添加索引、删除索引、重命名表、设置默认值和删除默认值等。在线 DDL 提高了数据库的可用性和性能,但在执行时仍需注意锁机制、资源消耗和版本差异等问题。