阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL5.6在线DDL更改表测试

167次阅读
没有评论

共计 1108 个字符,预计需要花费 3 分钟才能阅读完成。

MySQL5.6 在线 DDL 更改表测试,首先我们在这里普及下基础知识:在之前的版本,在线更改表,比如增加一个字段,其内部原理是这样的:

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 万行的数据,数据大一些,可以看出效果来。

sysbench –test=oltp –mysql-table-engine=innodb –oltp-table-size=10000000 –max-requests=100 –num-threads=16
–mysql-host=192.168.110.140 –mysql-port=3306 –mysql-user=admin –mysql-password=123456 –mysql-db=test
–mysql-socket=/tmp/mysql.sock prepare

然后在会话一,执行:

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

会话二,执行:

delete from sbtest where id=1000;
insert into sbtest values(1000,1,’abc’,’abc’,’abc’); 
update sbtest set k=11 where id=1000;

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

MySQL5.6 在线 DDL 更改表测试

但在 MySQL5.5 里,这样的操作是会锁表的,如图所示:

MySQL5.6 在线 DDL 更改表测试

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

 

在会话一:

select * from sbtest;

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

alter table sbtest drop name;

这时就会把表给锁了,如图所示:

MySQL5.6 在线 DDL 更改表测试

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

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

参考手册:

MySQL5.6 在线 DDL 更改表测试

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-08/134761.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计1108字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中