被面试官PUA了:创建索引时一定会锁表?

索引主要是用于提高数据检索速度的一种机制,通过索引数据库可以快速定位到目标数据的位置,而不需要遍历整个数据集,它就像书籍的目录部分,有它的存在,可以大大加速查询的效率。

那么问题来了:在创建索引时一定会锁表吗?

如果你看的是网上的一些资料,或者是通过 chatgpt,那么很可能得到的结果是这样的"是的,创建索引时是会锁表的。",但这个回答是不正确的,为什么呢?

典型回答

因为在 MySQL 5.6 之前,创建索引时会锁表,所以,在早期 MySQL 版本中一定要在线上慎用,因为创建索引时会导致其他会话阻塞(select 查询命令除外)。

但这个问题,在 MySQL 5.6.7 版本中得到了改变,因为在 MySQL 5.6.7 中引入了 Online DDL 技术(在线 DDL 技术),它允许在创建索引时,不阻塞其他会话(所有的 DML 操作都可以一起并发执行)。

什么是 DDL?

DDL(Data Definition Language,数据库定义语言):用于定义和管理数据库的结构,它主要包括以下语句:

  • CREATE:用于创建数据库、表、索引、视图等对象。
  • ALTER:用于修改数据库、表、索引、视图等已存在的对象的结构。
  • DROP:用于删除数据库、表、索引、视图等对象。
  • TRUNCATE:用于删除表中的所有数据,但保留表的结构。
  • RENAME:用于重命名数据库、表等对象。

什么是 DML?

DML (Data Manipulation Language,数据操作语言) :用于查询和修改数据,它主要包括以下语句:

  • INSERT:用于向表中插入新的数据行。
  • UPDATE:用于更新表中已存在的数据行。
  • DELETE:用于删除表中的数据行。
  • SELECT:用于从表中检索数据。虽然 SELECT 主要用于查询,但某些包含数据修改的扩展 SQL 功能(如 LIMIT、ORDER BY、GROUP BY 等)也属于 DML 的范畴。

什么是 Online DDL?

Online DDL(Online Data Definition Language,在线数据定义语言)是指在数据库运行期间执行对表结构或其他数据库对象的更改操作,而不需要中断或阻塞其他正在进行的事务和查询。

Online DDL 官方介绍文档:dev.mysql.com/doc/refman/...

Online DDL 最重要操作定义如下: 简单翻译一下以上内容: 从上面的表格可以看出,有了 Online DDL 技术之后,在添加索引时,会对原本进行操作,并且允许和 DML(数据操作语言 INSERT、UPDATE、DELETE、SELECT)一起并发执行了。

小结

在 MySQL 5.6 之前,创建索引时会锁表,但在 MySQL 5.6.7 之后,因为新增了 Online DDL 技术,所以此时在添加索引时,是可以和 DML 数据操作语言 INSERT、UPDATE、DELETE、SELECT 等命令一起执行的。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

相关推荐
腻害兔4 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
GetcharZp4 小时前
抛弃低效SSH!这套Ansible+Web可视化神器,让你天天准点下班!
后端
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
触底反弹5 小时前
🔥 2026 大模型选择指南:别再只看 Benchmark 了,这些维度才是关键!
人工智能·面试
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨6 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
醇氧7 小时前
CountDownLatch / CyclicBarrier / Semaphore 面试高频问答清单
前端·面试·职场和发展
weixin_446260857 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
ttwuai9 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang