首页 > 编程知识 正文

mysqlselect导致锁表,mysql建索引会锁表吗

时间:2023-05-04 00:17:05 阅读:266667 作者:3689

在数据库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作为关联条件。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。