mysql创建索引导致锁表阻塞查询

在Oracle至MySQL数据库迁移过程中,团队成员对同一表进行不同操作时可能遇到索引冲突,导致操作停滞。文章详细解析了MySQL的Waiting for table metadata lock现象,及其对业务的潜在影响,并提供了解决方案,包括如何通过kill慢SQL进程快速解决索引创建延迟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在数据库oracle迁移到mysql的过程中,因为团队每个人都负责了一些模块,难免会对表的操作有冲突,比如我正在给这张表创建索引,但是他却在进行查询,这样就会导致双方都失败。

正所谓MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对TableA的任何操作(包括读)都无法进行,因为他们也会在Opening tables的阶段进入到Waiting for table metadata lock的锁等待队列。如果是产品环境的核心表出现了这样的锁等待队列,就会造成灾难性的后果

解决方法通过命令查看慢查询:
select * from information_schema.processlist where command not in (‘Sleep’)
发现有慢SQL,针对该表。
解决方式:kill掉慢SQL进程,索引添加立刻完成

附上慢sql问题解析:

ALL, index, range, ref, eq_ref, const, system, NULL

ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
index:Full Index Scan,index与ALL区别为index类型只遍历索引树
range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行。显而易见的索引范围扫描是带有between或者where子句里带有<, >查询。当mysql使用索引去查找一系列值时,例如IN()和OR列表,也会显示range(范围扫描),当然性能上面是有差异的。
ref:使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行
eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值