在线 Java 面试刷题持续更新https://www.quanxiaoha.com/java-interview面试考察点DDL 机制理解面试官不仅仅是想知道一个 是 或 否 的答案更是想知道你是否理解 MySQL 的 DDL数据定义语言执行机制以及 Online DDL 的原理。版本差异意识考察你是否清楚 MySQL 5.5、5.6、8.0 在 DDL 操作上的重大差异能否根据版本给出准确回答。生产实践能力是否知道在线上加索引的正确姿势如何避免影响业务以及遇到紧急情况如何处理。核心答案分情况回答MySQL 版本加索引行为是否锁表MySQL 5.5 及以下COPY方式✅锁表全表禁止读写MySQL 5.6Online DDL默认❌不锁表支持并发读写MySQL 8.0Instant DDL部分支持❌秒级完成几乎无影响一句话总结MySQL 5.6 之后默认使用 Online DDL加索引不会阻塞读写但在准备和提交阶段会有短暂的元数据锁MDL生产环境建议使用ALGORITHMINPLACE, LOCKNONE明确指定。深度解析一、DDL 的三种算法img上图展示了 MySQL DDL 的三种算法COPY 算法最原始的方式。需要创建一个临时表然后把原表数据全部拷贝过去最后删除原表并重命名。这个过程会全程锁表大表可能需要几个小时生产环境绝对要避免。INPLACE 算法MySQL 5.6 引入的 Online DDL。直接在原表上操作不需要拷贝数据到临时表。在构建索引期间允许并发读写只在开始和结束阶段需要短暂的 MDL 锁。加索引默认使用这个算法。INSTANT 算法MySQL 8.0 引入。只修改表的元数据存储在.frm文件或数据字典中不涉及数据文件秒级完成。但目前只支持部分 DDL如添加列到表末尾、修改列默认值等加索引不支持 INSTANT。二、Online DDL 的执行过程img上图展示了 Online DDL 的三个执行阶段阶段一初始化需要获取 MDL 锁来修改表结构定义。这里有一个 降级 过程先获取排他锁评估成本然后快速降级为共享锁。这个阶段极短通常毫秒级。阶段二执行这是最耗时的阶段可能持续几分钟到几小时。但关键是允许并发 DMLInnoDB 会把执行期间的增量修改记录到 Online Log 中。阶段三提交需要重新获取 MDL 排他锁把 Online Log 中的增量数据应用到新索引上然后更新元数据。这个阶段也很短。潜在风险如果阶段三执行时有一个长查询持有 MDL 读锁DDL 会卡在等待 MDL 锁上而后续的请求也会被阻塞形成 锁等待链导致业务抖动。三、不同索引类型的加锁情况索引类型算法是否锁表备注普通二级索引INPLACE❌ 不锁表默认支持 Online DDL主键索引新增INPLACE❌ 不锁表需要重建表但允许并发主键索引删除INPLACE❌ 不锁表同上全文索引INPLACE❌ 不锁表首次创建可能较慢空间索引INPLACE❌ 不锁表MySQL 5.7四、生产环境最佳实践-- ✅ 推荐写法明确指定 Online DDL 参数 ALTER TABLE user ADD INDEX idx_create_time (create_time), ALGORITHMINPLACE, LOCKNONE; -- 参数说明 -- ALGORITHMINPLACE使用在线 DDL不拷贝数据 -- LOCKNONE不允许任何锁支持并发读写 -- 如果不支持 INPLACE会报错而不是降级到 COPY生产环境操作建议避开业务高峰期虽然 Online DDL 不锁表但会消耗 CPU 和 I/O 资源使用 pt-online-schema-change 工具Percona Toolkit适用于超大表或对稳定性要求极高的场景原理创建影子表 → 分批拷贝数据 → 触发器同步增量 → 原子切换监控 MDL 锁等待执行前检查是否有长事务使用 performance_schema.metadata_locks 监控设置超时时间LOCK_WAIT_TIMEOUT避免长时间等待 MDL 锁MAX_EXECUTION_TIME限制 DDL 最大执行时间检查是否有长事务-- 查看当前运行的事务 SELECT * FROM information_schema.INNODB_TRX; -- 查看 MDL 锁等待MySQL 8.0 SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS PENDING;面试高频追问追问一Online DDL 期间如果写入量很大会有什么影响Online Log 会持续增长可能导致内存压力Online Log 默认在内存中太大可能触发刷盘阶段三时间延长增量数据越多应用时间越长建议在写入低谷期执行或使用pt-osc工具追问二为什么有时候加索引还是会卡住通常是因为MDL 锁等待有长查询持有 MDL 读锁DDL 等待 MDL 写锁后续请求排队等待 DDL 释放解决方案NOWAIT或WAIT n语法或先 kill 长查询追问三ALGORITHMINPLACE和LOCKNONE有什么区别ALGORITHMINPLACE指定 DDL 执行算法不拷贝整表数据LOCKNONE指定加锁级别NONE表示不允许加任何锁两者配合使用确保 DDL 完全在线执行追问四8.0 的 Instant DDL 能用于加索引吗不能。Instant DDL 目前支持的场景有限✅ 添加列到表末尾✅ 删除列✅ 修改列默认值❌ 添加/删除索引仍需用 INPLACE常见面试变体MySQL 大表加索引有哪些方案Online DDL 的原理是什么会不会影响业务生产环境如何安全地给千万级大表加索引DDL 操作导致数据库抖动可能是什么原因记忆口诀版本差异5.5 锁表 5.6 在线8.0 部分秒级完算法演进Copy 拷贝锁全表Inplace 原地不阻塞Instant 秒改元数据生产操作避开高峰看长事务INPLACE NONE 双保险总结MySQL 5.6 之后InnoDB 加索引默认使用 Online DDLINPLACE算法不会锁表支持并发读写。但在执行的开始和结束阶段需要获取 MDL 锁如果有长事务可能导致阻塞。生产环境建议明确指定ALGORITHMINPLACE, LOCKNONE并在业务低峰期执行超大表可考虑使用pt-online-schema-change工具。 欢迎加入小哈的星球你将获得:专属的项目实战多个项目 / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论新项目《Spring AI 项目实战》正在更新中..., 基于 Spring AI Spring Boot 3.x JDK 21;《从零手撸仿小红书微服务架构》 已完结基于 Spring Cloud Alibaba Spring Boot 3.x JDK 17..., 点击查看项目介绍演示地址http://116.62.199.48:7070/《从零手撸前后端分离博客项目全栈开发》2期已完结,演示链接http://116.62.199.48/;专栏阅读地址https://www.quanxiaoha.com/column截止目前累计输出 100w 字讲解图 4013 张还在持续爆肝中..后续还会上新更多项目目标是将 Java 领域典型的项目都整一波如秒杀系统, 在线商城, IM 即时通讯Spring Cloud Alibaba 等等戳我加入学习解锁全部项目已有4500小伙伴加入1. 我的私密学习小圈子从0到1手撸企业实战项目~ 2. 同事一个比喻让我搞懂了 Docker 和 k8s 的核心概念 3. 字节一面Redis 和 Caffeine 的区别是什么 4. 从夯到拉锐评13个 Java Web 框架最近面试BAT整理一份面试资料《Java面试BATJ通关手册》覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式点“在看”关注公众号并回复 Java 领取更多内容陆续奉上。PS因公众号平台更改了推送规则如果不想错过内容记得读完点一下“在看”加个“星标”这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀谢谢啦
京东二面:加索引时,会锁表吗?(修订版)
在线 Java 面试刷题持续更新https://www.quanxiaoha.com/java-interview面试考察点DDL 机制理解面试官不仅仅是想知道一个 是 或 否 的答案更是想知道你是否理解 MySQL 的 DDL数据定义语言执行机制以及 Online DDL 的原理。版本差异意识考察你是否清楚 MySQL 5.5、5.6、8.0 在 DDL 操作上的重大差异能否根据版本给出准确回答。生产实践能力是否知道在线上加索引的正确姿势如何避免影响业务以及遇到紧急情况如何处理。核心答案分情况回答MySQL 版本加索引行为是否锁表MySQL 5.5 及以下COPY方式✅锁表全表禁止读写MySQL 5.6Online DDL默认❌不锁表支持并发读写MySQL 8.0Instant DDL部分支持❌秒级完成几乎无影响一句话总结MySQL 5.6 之后默认使用 Online DDL加索引不会阻塞读写但在准备和提交阶段会有短暂的元数据锁MDL生产环境建议使用ALGORITHMINPLACE, LOCKNONE明确指定。深度解析一、DDL 的三种算法img上图展示了 MySQL DDL 的三种算法COPY 算法最原始的方式。需要创建一个临时表然后把原表数据全部拷贝过去最后删除原表并重命名。这个过程会全程锁表大表可能需要几个小时生产环境绝对要避免。INPLACE 算法MySQL 5.6 引入的 Online DDL。直接在原表上操作不需要拷贝数据到临时表。在构建索引期间允许并发读写只在开始和结束阶段需要短暂的 MDL 锁。加索引默认使用这个算法。INSTANT 算法MySQL 8.0 引入。只修改表的元数据存储在.frm文件或数据字典中不涉及数据文件秒级完成。但目前只支持部分 DDL如添加列到表末尾、修改列默认值等加索引不支持 INSTANT。二、Online DDL 的执行过程img上图展示了 Online DDL 的三个执行阶段阶段一初始化需要获取 MDL 锁来修改表结构定义。这里有一个 降级 过程先获取排他锁评估成本然后快速降级为共享锁。这个阶段极短通常毫秒级。阶段二执行这是最耗时的阶段可能持续几分钟到几小时。但关键是允许并发 DMLInnoDB 会把执行期间的增量修改记录到 Online Log 中。阶段三提交需要重新获取 MDL 排他锁把 Online Log 中的增量数据应用到新索引上然后更新元数据。这个阶段也很短。潜在风险如果阶段三执行时有一个长查询持有 MDL 读锁DDL 会卡在等待 MDL 锁上而后续的请求也会被阻塞形成 锁等待链导致业务抖动。三、不同索引类型的加锁情况索引类型算法是否锁表备注普通二级索引INPLACE❌ 不锁表默认支持 Online DDL主键索引新增INPLACE❌ 不锁表需要重建表但允许并发主键索引删除INPLACE❌ 不锁表同上全文索引INPLACE❌ 不锁表首次创建可能较慢空间索引INPLACE❌ 不锁表MySQL 5.7四、生产环境最佳实践-- ✅ 推荐写法明确指定 Online DDL 参数 ALTER TABLE user ADD INDEX idx_create_time (create_time), ALGORITHMINPLACE, LOCKNONE; -- 参数说明 -- ALGORITHMINPLACE使用在线 DDL不拷贝数据 -- LOCKNONE不允许任何锁支持并发读写 -- 如果不支持 INPLACE会报错而不是降级到 COPY生产环境操作建议避开业务高峰期虽然 Online DDL 不锁表但会消耗 CPU 和 I/O 资源使用 pt-online-schema-change 工具Percona Toolkit适用于超大表或对稳定性要求极高的场景原理创建影子表 → 分批拷贝数据 → 触发器同步增量 → 原子切换监控 MDL 锁等待执行前检查是否有长事务使用 performance_schema.metadata_locks 监控设置超时时间LOCK_WAIT_TIMEOUT避免长时间等待 MDL 锁MAX_EXECUTION_TIME限制 DDL 最大执行时间检查是否有长事务-- 查看当前运行的事务 SELECT * FROM information_schema.INNODB_TRX; -- 查看 MDL 锁等待MySQL 8.0 SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS PENDING;面试高频追问追问一Online DDL 期间如果写入量很大会有什么影响Online Log 会持续增长可能导致内存压力Online Log 默认在内存中太大可能触发刷盘阶段三时间延长增量数据越多应用时间越长建议在写入低谷期执行或使用pt-osc工具追问二为什么有时候加索引还是会卡住通常是因为MDL 锁等待有长查询持有 MDL 读锁DDL 等待 MDL 写锁后续请求排队等待 DDL 释放解决方案NOWAIT或WAIT n语法或先 kill 长查询追问三ALGORITHMINPLACE和LOCKNONE有什么区别ALGORITHMINPLACE指定 DDL 执行算法不拷贝整表数据LOCKNONE指定加锁级别NONE表示不允许加任何锁两者配合使用确保 DDL 完全在线执行追问四8.0 的 Instant DDL 能用于加索引吗不能。Instant DDL 目前支持的场景有限✅ 添加列到表末尾✅ 删除列✅ 修改列默认值❌ 添加/删除索引仍需用 INPLACE常见面试变体MySQL 大表加索引有哪些方案Online DDL 的原理是什么会不会影响业务生产环境如何安全地给千万级大表加索引DDL 操作导致数据库抖动可能是什么原因记忆口诀版本差异5.5 锁表 5.6 在线8.0 部分秒级完算法演进Copy 拷贝锁全表Inplace 原地不阻塞Instant 秒改元数据生产操作避开高峰看长事务INPLACE NONE 双保险总结MySQL 5.6 之后InnoDB 加索引默认使用 Online DDLINPLACE算法不会锁表支持并发读写。但在执行的开始和结束阶段需要获取 MDL 锁如果有长事务可能导致阻塞。生产环境建议明确指定ALGORITHMINPLACE, LOCKNONE并在业务低峰期执行超大表可考虑使用pt-online-schema-change工具。 欢迎加入小哈的星球你将获得:专属的项目实战多个项目 / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论新项目《Spring AI 项目实战》正在更新中..., 基于 Spring AI Spring Boot 3.x JDK 21;《从零手撸仿小红书微服务架构》 已完结基于 Spring Cloud Alibaba Spring Boot 3.x JDK 17..., 点击查看项目介绍演示地址http://116.62.199.48:7070/《从零手撸前后端分离博客项目全栈开发》2期已完结,演示链接http://116.62.199.48/;专栏阅读地址https://www.quanxiaoha.com/column截止目前累计输出 100w 字讲解图 4013 张还在持续爆肝中..后续还会上新更多项目目标是将 Java 领域典型的项目都整一波如秒杀系统, 在线商城, IM 即时通讯Spring Cloud Alibaba 等等戳我加入学习解锁全部项目已有4500小伙伴加入1. 我的私密学习小圈子从0到1手撸企业实战项目~ 2. 同事一个比喻让我搞懂了 Docker 和 k8s 的核心概念 3. 字节一面Redis 和 Caffeine 的区别是什么 4. 从夯到拉锐评13个 Java Web 框架最近面试BAT整理一份面试资料《Java面试BATJ通关手册》覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式点“在看”关注公众号并回复 Java 领取更多内容陆续奉上。PS因公众号平台更改了推送规则如果不想错过内容记得读完点一下“在看”加个“星标”这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀谢谢啦