被面试官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、设计模式、消息队列等模块。

相关推荐
盐真卿11 分钟前
python2
java·前端·javascript
梦梦代码精30 分钟前
BuildingAI vs Dify vs 扣子:三大开源智能体平台架构风格对比
开发语言·前端·数据库·后端·架构·开源·推荐算法
一嘴一个橘子1 小时前
mybatis - 动态语句、批量注册mapper、分页插件
java
组合缺一1 小时前
Json Dom 怎么玩转?
java·json·dom·snack4
REDcker1 小时前
RESTful API设计规范详解
服务器·后端·接口·api·restful·博客·后端开发
危险、1 小时前
一套提升 Spring Boot 项目的高并发、高可用能力的 Cursor 专用提示词
java·spring boot·提示词
kaico20182 小时前
JDK11新特性
java
钊兵2 小时前
java实现GeoJSON地理信息对经纬度点的匹配
java·开发语言
jiayong232 小时前
Tomcat性能优化面试题
java·性能优化·tomcat
秋刀鱼程序编程2 小时前
Java基础入门(五)----面向对象(上)
java·开发语言