在上一篇文章中《浅谈MySQL Online DDL (上)》中,咱们谈到了MySQL Online DDL的由来,还介绍了聚簇索引与二级索引的区别。今天,咱们继续谈谈MySQL Online DDL。mysql
在上篇文章中,咱们知道了『快速索引建立』的优势,对于MySQL 5.7版原本说,这也就成为了Online DDL的优势了,并且加强了很多。优势以下:sql
不影响生产环境数据库运行,在DDL操做时,不影响生产上的查询,以及DML操做。数据库
减小在建立,修改二级索引时,带来不必的数据复制,临时表建立时的磁盘与IO开销。微信
可以人为经过Lock语句平衡性能与开销。并发
Online DDL语法上,其实并无特殊的之处的。咱们知道Online DDL这个概念在MySQL5.6首次出现,虽然在语法上没有特殊的之处,但官方为咱们在原来的DDL语法上添加了一些控制性能与并发的属性,这里以alter
为例(以下所示):
演示MySQL版本: 5.7.20工具
alter table t_base_user modify telephone varchar(50),lock=none ;
上面这条语句很是简单,就是修改 t_base_user 表中 telephone字段属性。
其中 lock=none 是咱们比较陌生的,这个就是MySQL5.6中用来控制性能的属性,须要注意的是,在MySQL5.6以前的版本中,这样的语法是不支持的。执行时会直接报语法不支持的错误。那 lock=none 表明什么意思呢?性能
Online DDL语句和DDL语句是同样的,执行时一样的会加锁,(这里就统一说成锁吧,MySQL锁是一个比较大的话题,下次详细说明)。测试
官方给咱们提供了几个可选项:spa
LOCK=EXCLUSIVE : 表示独占锁,DDL语句执行期间会阻塞该表的全部请求。设计
LOCK=SHARED:共享锁,DDL语句执行期间会阻塞除查询外的全部DML操做,如: insert,update等。
LOCK=NONE: 容许全部查询以及DML操做。
LOCK=DEFAULT 默认级别,MySQL尽量容许最大的并发操做。
当咱们不显示指定时,默认就为LOCK=DEFAULT类型。
须要注意的是:
不是全部的DDL操做LOCK类型均可以指定为NONE的。若是DDL操做的类型,不能以请求的锁定类型执行,则会执行失败。
在执行有些DDL语句时(修改字段类型),实际上是有风险的,那怎么避免风险呢?这个时候就要经过执rows affected类分析了。
以下所示:
mysql> alter table t_base_user modify telephone varchar(50),lock=none ; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0
这里显示咱们修改t_base_user表telephone字段会很是快,并且不会重建表。这是因为演示数据比较少致使的。当生产数据比较多时,是会重建表的。
下面给出了一些参考选项:
更改列的默认值(超快,彻底不影响表数据):
Query OK, 0 rows affected (0.07 sec)
添加一个索引(须要时间,可是0 rows affected显示表格不被复制):
Query OK, 0 rows affected (21.42 sec)
更改列的数据类型(须要大量的时间,而且须要重建表的全部行):
Query OK, 1671168 rows affected (1 min 35.54 sec)
咱们能够经过上述的执行结果,查看该语句是否复制记录,重建整个表格(咱们上篇说过,若是重建,成本会很是高,并且还会影响线上DML)等。显然,直接在生产上运行该语句后,再看结果来分析。已经没有意义了,咱们能够经过在测试环境中来看。具体步骤以下:
复制须要ddl的生产表结构到测试环境中。
添加部分数据到该表中。
执行ddl操做。
查看rows affected 值是否为0,非0时,意味着操做须要重建整个表,这时候就须要从新指定方案,如:在停机时进行操做,或业务低估时进行操做。
命令:
SHOW CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
做用:显示指定数据库的建立语句。
例子:
mysql> show create database andyqian\G *************************** 1. row *************************** Database: andyqian Create Database: CREATE DATABASE `andyqian` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */ 1 row in set (0.00 sec)
其中:
Database 表示数据库名。
Create Database 表示建立数据库语句。
这里须要注意的是:
show create database andyqian\G
与
show create schema andyqian\G
上述两个语句的,执行结果是同样的。
注意:
andyqian为指定的数据库名,请替换至本身须要显示的数据库名。
在 Navicat 第三方工具时运行时,不须要添加\G
。命令以下便可:
show create schema andyqian;
在这一篇中,咱们简单了介绍了MySQL Online DDL的语法,以及锁类型等等。其实Online DDL也是有条件限制的,以及Online DDL语句的实现细节,咱们在下一篇文章中继续说。尽请期待!
最后:周五了,立刻就周末了,准备好周末怎么过了吗?
推荐阅读:
扫码关注,一块儿进步
我的博客: http://www.andyqian.com