主题
面试速答(先看这里)
**一句话结论:**因为DDL有很多种操作,比如创建索引、增加字段、增加外键等,所以不同的操作支持的类型也不一样,具体支持方式可以在mysql官方可以看到( ),拿索引创建举例:
60秒标准回答:
在 MySQL 5.6 之前,InnoDB 索引构建期间会对表进行排它锁定,这意味着在索引构建期间,其他会话不能读取或修改表中的任何数据。这将导致长时间阻塞和性能问题
自 MySQL 5.6 开始,InnoDB 使用一种称为“Online DDL”的技术,允许在不阻塞其他会话的情况下创建或删除索引 。Online DDL 针对不同的操作,有多种实现方式,包括COPY,INSTANT以及INPLACE
因为DDL有很多种操作,比如创建索引、增加字段、增加外键等,所以不同的操作支持的类型也不一样,具体支持方式可以在mysql官方可以看到( ),拿索引创建举例
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**在 MySQL 5.6 之前,InnoDB 索引构建期间会对表进行排它锁定,这意味着在索引构建期间,其他会话不能读取或修改表中的任何数据。
- **要点2:**自 MySQL 5.6 开始,InnoDB 使用一种称为“Online DDL”的技术,允许在不阻塞其他会话的情况下创建或删除索引 。
- **要点3:**从上表中可以看到,当我们创建、删除或者重命名一个索引的时候,是会用到in place的模式。
- **要点4:**需要注意的是,虽然Online DDL 可以减少锁定时间和对性能的影响,但在索引构建期间仍然可能出现锁定和阻塞。
**记忆锚点:**DDL → Online → InnoDB → MySQL → Online DDL原理 → devmysqlcom
关键取舍:
- 需要注意的是,虽然Online DDL 可以减少锁定时间和对性能的影响,但在索引构建期间仍然可能出现锁定和阻塞。
- 这将导致长时间阻塞和性能问题。
易错提醒:
- 在 MySQL 5.6 之前,InnoDB 索引构建期间会对表进行排它锁定,这意味着在索引构建期间,其他会话不能读取或修改表中的任何数据。
- 需要注意的是,虽然Online DDL 可以减少锁定时间和对性能的影响,但在索引构建期间仍然可能出现锁定和阻塞。
加分表达:
- 例如,在添加索引时,如果表中有许多未提交的事务,则需要等待这些事务提交后才能开始索引构建。
- 因此,建议在非高峰期进行此类操作,以避免影响用户的正常使用。
追问准备:
- 围绕「DDL」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Online」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「InnoDB」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
在 MySQL 5.6 之前,InnoDB 索引构建期间会对表进行排它锁定,这意味着在索引构建期间,其他会话不能读取或修改表中的任何数据。这将导致长时间阻塞和性能问题。
自 MySQL 5.6 开始,InnoDB 使用一种称为“Online DDL”的技术,允许在不阻塞其他会话的情况下创建或删除索引。Online DDL 针对不同的操作,有多种实现方式,包括COPY,INSTANT以及INPLACE
因为DDL有很多种操作,比如创建索引、增加字段、增加外键等,所以不同的操作支持的类型也不一样,具体支持方式可以在mysql官方可以看到(https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html ),拿索引创建举例:

从上表中可以看到,当我们创建、删除或者重命名一个索引的时候,是会用到in place的模式。
需要注意的是,虽然Online DDL 可以减少锁定时间和对性能的影响,但在索引构建期间仍然可能出现锁定和阻塞。例如,在添加索引时,如果表中有许多未提交的事务,则需要等待这些事务提交后才能开始索引构建。**因此,建议在非高峰期进行此类操作,以避免影响用户的正常使用。**在进行任何DDL操作之前,最好进行充分的测试和规划,并且确保有备份和回滚计划,以防意外情况的发生。