Mysql ALTER TABLE加字段的时候到底锁不锁表_Mysql

来源:脚本之家  责任编辑:小易  
目录
Mysql5.6版本之前Mysql5.6版本之后
总结
注意

Mysql5.6版本之前

更新步骤

对原始表加写锁 按照原始表和执行语句的定义,重新定义一个空的临时表。 对临时表进行添加索引(如果有)。 再将原始表中的数据逐条Copy到临时表中。 当原始表中的所有记录都被Copy临时表后,将原始表进行删除。再将临时表命名为原始表表名。 这样的话整个DDL过程的就是全程锁表的。

Mysql5.6版本之后

更新步骤

对原始表加写锁 按照原始表和执行语句的定义,重新定义一个空的临时表。并申请rowlog的空间。 拷贝原表数据到临时表,此时的表数据修改操作(增删改)都会存放在rowlog中。此时该表客户端可以进行操作的。 原始表数据全部拷贝完成后,会将rowlog中的改动全部同步到临时表,这个过程客户端是不能操作的。 当原始表中的所有记录都被Copy临时表,并且Copy期间客户端的所有增删改操作都同步到临时表。再将临时表命名为原始表表名。

总结

ALTER TABLE 加字段会加锁。只是Mysql5.6版本之后新增了ONLINE DDL的功能,可以使该表不能使用的时间大大缩短。

注意

ALTER TABLE 加字段的时候。如果该表的数据量非常大。不要设置default值。
比如,当前有2000万以上数据量的表。如果加字段加了default值。Mysql会执行在执行Online DDL之后,对整个表的数据进行更新默认值的操作,即

UPDATE `table_name` SET new_col = [默认值] WHERE TRUE

这样就相当于是更新了2000w+的数据,而且是在同一个事务里。也就是说这个事务会把整个表都锁住,直到所有的数据记录都更新完默认值以后,才会提交。

这个时间非常长,而且由于会锁全表的记录,所以该表不可用的时间会非常长。

笔者实验过16核,32G,Mysql默认配置。500w的数据量加一个字段。

不加default值,整个DDL更新过程是66秒。而且整个更新过程,该表的查询、修改、新增操作都是可用的。几乎对该表的可用性没有任何影响。

加default值,整个DDL更新过程是213秒。经过测试,大约在100秒之后,该表的查询、修改、新增操作都会陷入等待状态。

到此这篇关于Mysql ALTER TABLE加字段的时候到底锁不锁表的文章就介绍到这了,更多相关Mysql ALTER TABLE加字段内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:mysql alter table 修改表命令详细介绍mysql alter table修改表命令整理mysql alter table命令修改表结构实例mysql alter table命令修改表结构实例详解MySQL中的alter table命令的基本使用方法及提速优化MySQL学习笔记5:修改表(alter table)

  • 本文相关:
  • 正确理解mysql中的列索引和多列索引
  • 详解mysql 8.0.18命令
  • linux下mysql 5.6.17安装图文教程详细版
  • rpm方式安装mysql5.6源码
  • arm64架构下安装mysql5.7.22的全过程
  • mysql在不知道列名情况下的注入详解
  • mysql的case when语句的几个使用实例
  • mysql 一个巧用字符函数做数据筛选的题
  • 简单了解mysql mycat 中间件
  • mysql8.0.11数据目录迁移的实现
  • 将字段修改成自增长类型的SQL语句怎么写?不可以直接alter吗...
  • mysql表的基础操作汇总(三)
  • MySQL 常见数据拆分办法
  • MySQL的权限有哪些
  • SQL modify不起作用
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mysqlmysql alter table 修改表命令详细介绍mysql alter table修改表命令整理mysql alter table命令修改表结构实例mysql alter table命令修改表结构实例详解mysql中的alter table命令的基本使用方法及提速优化mysql学习笔记5:修改表(alter table)正确理解mysql中的列索引和多列索引详解mysql 8.0.18命令linux下mysql 5.6.17安装图文教程详细版rpm方式安装mysql5.6源码arm64架构下安装mysql5.7.22的全过程mysql在不知道列名情况下的注入详解mysql的case when语句的几个使用实例mysql 一个巧用字符函数做数据筛选的题简单了解mysql mycat 中间件mysql8.0.11数据目录迁移的实现mysql安装图解 mysql图文安装教程can""""t connect to mysql servwindows下mysql5.6版本安装及配置mysql字符串截取函数substring的mysql创建用户与授权方法mysql提示:the server quit withmysql之timestamp(时间戳)用法mysql——修改root密码的4种方法mysql日期数据类型、时间类型使用mysql update语句的用法详解mysql中用通用查询日志找出查询次数最多的windows下mysql 8.0.11 安装教程mariadb(mysql)创建、删除、选择及数据类mysql代码执行结构实例分析【顺序、分支、详解jdbc数据库链接及相关方法的封装debian 6.02 (squeeze)下编译安装 mysql mysql update多表联合更新的方法小结mysql数据库如何开启远程连接(多备份)linux/mac安装mysql忘记密码的解决办法mysql 修改root密码命令小结
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved