php5.6 optimize 锁表,MySQL5.6 在线DDL更改表测试

在MySQL5.6版本中,对在线DDL操作进行了优化,允许在增加字段时其他会话可以继续进行增删改查操作而不锁表。然而,在特定情况下,如在大结果集查询后执行删除字段的操作,仍可能导致锁表。因此,凌晨上线时需要注意是否存在可能引起锁等待的慢SQL,避免影响服务。

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

先在这里普及下基础知识:在之前的版本,在线更改表,比如增加一个字段,其内部原理是这样的:1、createtabletmpliket1(创建一个临时表)2、insertintotmpselec

先在这里普及下基础知识:

在之前的版本,在线更改表,比如增加一个字段,其内部原理是这样的:

1、create table tmp like t1(创建一个临时表)

2、insert into tmp select * from t1(一行行的把原表数据拷贝到临时表里,且更新索引)

3、drop table t1;rename table tmp to t1(删除原表并把临时表改名为原表t1)

在这个过程中会对t1表加S锁(共享锁),所以这个代价是很高的。

而在MySQL5.6里,对其进行了优化,当会话一增加字段时,其他会话增,删,改,查,均不受影响,不会锁表。

比如这样测试,用Sysbench生成一张1000万行的数据,数据大一些,可以看出效果来。

然后在会话一,执行:

alter table sbtest add name varchar(10) after pad;

会话二,执行:

insert into sbtest values(1000,1,'abc','abc','abc');

这时你会发现并没有锁表,顺利执行完毕。

aa5f1e6ea7ffd5d0365a3542fd8dcea8.png

但在MySQL5.5里,香港空间,网站空间,这样的操作是会锁表的,如图所示:

ed423a5d3e9e5ddca54206c8a9cfcef3.png

那么MySQL5.6 在线DDL就一定不锁表吗?我们再这样测试:

在会话一:

select * from sbtest;

故意执行一条大结果的查询,然后再执行删除刚才增加的字段name

alter table sbtest drop name;

这时就会把表给锁了,香港空间,如图所示:

19bf4b8a563a8eab5eacda582dd52cf3.png

也就是说,在执行alter table表时,对该表的增、删、改、查均不会锁表。而在这之前,该表有被访问时,需要等其执行完毕后,才可以执行alter table。

所以在凌晨上线时,一定要观察下,此时此刻,是否有某个慢SQL对该表进行操作,以免改表时出现锁等待现象。

参考手册:

b282068e4710b4603ebf01e68a753209.png

本文出自 “贺春旸的技术专栏” 博客,请务必保留此出处

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值