mysql加索引的时候到底会不会锁表.深入解析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
全局流量管理 GTM,标准版 1个月
简介: 默认大部分情况下 mysql的在线DDL可以让我们加索引的时候不锁表,但是也有一些限制的场景,跟本次问题相关的限制情况是在线DDL 操作完成之前,它必须等待在表上持有元数据锁(Metadata Lock)的事务提交或回滚。

Mysql索引 MetaData DDL锁表


问题背景


没找到关于加索引的时候导致锁表的解析,在百度上偶尔几篇此标题的文章也只是简单说一句kill掉进程就恢复,至于为什么发生根本没有进行解析。


在工作中和学习中,哪怕可以暂时解决问题也得不到帮助。


排查思路


Online DDL


跟朋友讨论中,首先提到的是mysql可以在线DDL官方文档


image.png


Mysql默认是可以支持在线DDL的,将会尽可能地少占用或者不占用锁来进行DDL(有限制条件)


符合在线DDL的场景下,在创建索引时,该表仍然可用于读写操作。


CREATE INDEX 语句仅在访问该表的所有事务完成之后才结束,以便索引的初始状态反映该表的最新数据内容。


其他俩个扩展相关的知识和语法


ALTER TABLE tbl_name DROP INDEX i1, ADD INDEX i1(key_part,...)

USING BTREE, ALGORITHM=INPLACE, LOCK=NONE;


  • ALGORITHM可选: INPLACE / COPY
  • LOCK可选: NONE SHARED 等加锁情况 -> 在 ALTER TABLE 语句上指定一个子句,如 LOCK = NONE (许可读和写)或 LOCK = SHARED (许可读)。如果请求的并发级别不可用,操作将立即停止。


ALGORITHM=INPLACE
更优秀的解决方案,在当前表加索引,步骤:
1.创建索引(二级索引)数据字典
2.加共享表锁,禁止DML,允许查询
3.读取聚簇索引,构造新的索引项,排序并插
入新索引
4.等待打开当前表的所有只读事务提交
5.创建索引结束
ALGORITHM=COPY
通过临时表创建索引,需要多一倍存储,还有更多的IO,步骤:
1.新建带索引(主键索引)的临时表
2.锁原表,禁止DML,允许查询
3.将原表数据拷贝到临时表
4.禁止读写,进行rename,升级字典锁
5.完成创建索引操作
LOCK=DEFAULT:默认方式,MySQL自行判断使用哪种LOCK模式,尽量不锁表
LOCK=NONE:无锁:允许Online DDL期间进行并发读写操作。如果Online DDL操
作不支持对表的继续写入,则DDL操作失败,对表修改无效
LOCK=SHARED:共享锁:Online DDL操作期间堵塞写入,不影响读取
LOCK=EXCLUSIVE:排它锁:Online DDL操作期间不允许对锁表进行任何操作


默认大部分情况下 mysql的在线DDL可以让我们加索引的时候不锁表,但是也有一些限制的场景,跟本次问题相关的限制情况是


在线DDL 操作完成之前,它必须等待在表上持有元数据锁(Metadata Lock)的事务提交或回滚。


image.png


Metadata Lock


元数据(MetaData)指的是定义数据结构的数据。实际上,除了表本身之外的数据都是元数据。


举例:表的状态信息,属性和权限等,操作结果信息,某条指令影响的记录数,MySQL服务器信息


Metadata Lock有很多类型 可参考


总结


所以综合以上资料的整理,如果DDL(如加索引或者字段)的时候,有存在活动中的事务(慢查询或者死锁等情况),DDL需要等待获取Metadata Lock,并且由于DDL获取的是写锁,


写锁优先级大于读锁,将会堵塞后续的其他新查询,先处理DDL的写锁请求


造成DDL操作时候可能影响业务数据运行


我们在进行DDL之前要先检查是否有慢查询或者异常的事务进程 先kill掉,再可以通过ALGORITHM和LOCK子句来限制取锁情况

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5天前
|
存储 关系型数据库 MySQL
MySQL基础:索引
MySQL中的索引是一种数据结构,能大幅提升数据库查询效率和减少I/O成本,类似于书的目录帮助快速定位内容。其优势包括提高检索效率和降低排序成本,但会占用空间并影响更新表的效率。鉴于查询远多于更新,索引仍被推荐使用。索引分为多种类型,如B+树和哈希索引,其中B+树因其较低的高度和稳定的查询开销成为常用选择。创建和删除索引需谨慎,以免影响性能。
25 4
MySQL基础:索引
|
9天前
|
存储 关系型数据库 MySQL
MySQL 中的事务存储引擎深入解析
【8月更文挑战第31天】
11 0
|
9天前
|
存储 关系型数据库 MySQL
MySQL 中的 BLOB 数据类型深入解析
【8月更文挑战第31天】
54 0
|
9天前
|
存储 关系型数据库 MySQL
|
9天前
|
存储 缓存 关系型数据库
|
9天前
|
存储 关系型数据库 MySQL
深入解析 MySQL 中的扩展
【8月更文挑战第31天】
10 0
|
9天前
|
关系型数据库 MySQL 数据管理
深入解析 MySQL 中的关系类型
【8月更文挑战第31天】
12 0
|
9天前
|
SQL 关系型数据库 MySQL
|
10天前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
67 0
|
11天前
|
SQL 关系型数据库 MySQL
深入探索MySQL索引策略
本文旨在深入探讨MySQL(8.0.26)数据库中索引的设计与优化方法。

热门文章

最新文章

推荐镜像

更多
下一篇
DDNS