MySQL5.6 在线DDL更改表测试

php中文网
发布: 2016-06-07 17:41:51
原创
1589人浏览过

先在这里普及下基础知识:在之前的版本,在线更改表,比如增加一个字段,其内部原理是这样的: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'); 
  • 这时你会发现并没有锁表,顺利执行完毕。

    ecshop
    ecshop

    本版本全面兼容php5.6+,并且修复了许多官方程序的低级代码bug。在apache 2.4.17+php5.6.15环境下测试通过,人格保证无毒无木马,仅仅是一名ecshop热爱者心血来潮之作。ecshop编译更新日志:1、加入最新官方补丁。2、修改数据库连接底层为mysqli, 现在完美无缺了。3、再次对所有代码进行细节修复。4、adminers更新至1.1.2, 在线管理数据库的神器。5、测

    ecshop 0
    查看详情 ecshop

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

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

    在会话一:

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

  • alter table sbtest drop name; 
  • 这时就会把表给锁了,香港空间,如图所示:

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

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

    参考手册:

     

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

    最佳 Windows 性能的顶级免费优化软件
    最佳 Windows 性能的顶级免费优化软件

    每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

    下载
    来源:php中文网
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    最新问题
    开源免费商场系统广告
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号