您的位置:首页 > 数据库 > MySQL

5分钟了解MySQL5.7的Online DDL雷区

2016-09-26 10:30 381 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://suifu.blog.51cto.com/9167728/1855872

Part1:写在最前

Online DDL,当新手听到这个名字的时候,非常高兴,以为无论什么情况下,修改表结构都不会锁表,理想很丰满,现实很骨感!读完本文,教你如何避开这些雷区,安全的修改表结构。话不多说,我们分别来看下MySQL5.6和MySQL5.7在修改表结构上的相同和异同。

Part2:5.6.25的表现

首先我们构造数据并进行测试

[b]Tips:心得[/b]

可以看出5.6.25这里并不支持ALGORITHM,而直接对表进行修改的话用了9.44s。

[b]②[/b]接下来我们测试下变更varchar长度是否锁表

可以看到在对c6字段修改表结构时,对c1字段无法更新,被锁

[b]Tips:心得[/b]

经测试,增加、删除字段或索引不锁全表,变更字段长度,锁表。

Part3:5.7.15的表现

[b][b]Tips:心得[/b][/b]

可以看到,这里用时0.01sec,和5.6的9.44sec效率差了相当多吧~

Warning:警告1

不过,ALGORITHM用法只对varcahr类型有效哦,比如我们对c1列int型进行变更:

c1原为int(10) 变更为int(11) unsigned则无效

[b][b]Tips:心得[/b][/b]

只变更int的位数,是可以的,不过这没什么意义,因为无论你int多少,最多都只能存10位,这也就是为什么我们生产库开发规范要定义所有的int都用int(10)。

生产库开发规范详见:

http://suifu.blog.51cto.com/9167728/1792604



[b]Warning:警告2[/b]

如果字段属性大于并等于varchar(256)(这里的256是指字节(UTF8占用3字节)或者把varchar(80)减少到varchar(70)或者更少),则仍需要拷贝数据且锁全表。

[b][b]Warning:警告3[/b][/b]

添加字段alter table时,对该表的增删改查均不会锁表。而在这之前,当该表被访问时,需要等其执行完毕后才可以执行alter table。

——总结——

在varchar变更字段长度方面,5.7的新特性ALGORITHM参数可以快速调整varchar类型的字段长度。5.7同5.6一样,增加,删除字段或索引不锁全表,删除主键锁全表。因此,在上线时,一定要执行show processlist命令并观察,此刻是否有某个慢SQL对该表进行操作,以免alter table表时出现锁表现象。[b]由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。[/b]

本文出自 “岁伏” 博客,请务必保留此出处http://suifu.blog.51cto.com/9167728/1855872
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: