得物面试:创建索引时会不会锁表?
共 1954字,需浏览 4分钟
·
2024-06-02 15:11
索引主要是用于提高数据检索速度的一种机制,通过索引数据库可以快速定位到目标数据的位置,而不需要遍历整个数据集,它就像书籍的目录部分,有它的存在,可以大大加速查询的效率。
那么问题来了:在创建索引时一定会锁表吗?
如果你看的是网上的一些资料,或者是通过 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 官方介绍文档:https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html
Online DDL 最重要操作定义如下:简单翻译一下以上内容:从上面的表格可以看出,有了 Online DDL 技术之后,在添加索引时,会对原本进行操作,并且允许和 DML(数据操作语言 INSERT、UPDATE、DELETE、SELECT)一起并发执行了。
小结
说件大事
磊哥一直在做的事,为了让大家找到更好的工作,所以有着 13 年工作经验的我,开发了一门《Java 面试突击训练营》。
整个课程为期一个月,带着大家把 16 万的图文 + 3000 多分钟的视频课系统的学完,并且录屏支持永久更新和观看。
整个课程从 Java 基础到微服务 Spring Cloud 应用尽有,包含以下 16 个大的模块:
训练营带你高效的搞定面试问题,学完之后可以应对当前市面上绝大部分公司的面试,得到高薪 Offer。
加我微信咨询吧:GG_Stone【备注:训练营】