浅谈MySQL Online DDL (上)

本文首发于我的微信公众号《andyqian》,期待你的关注!

前言

  这个知识点,不瞒你说,我也是最近才了解到的,以为很是有用!就决定记录在这里,但愿对你也有所帮助。mysql

索引建立

  若是你对DDL还不了解,能够先看看上一篇文章《MySQL 命令种类》来回顾一下。咱们知道,在生产环境中作DDL操做成本是很是高的,为何这样说呢?咱们以(MySQL5.5以前版本)添加索引为例,须要经历的步骤有:sql

如上图所示: 经历步骤有:微信

  1. 按照原始表的定义,从新定义一个空的临时表。并发

  2. 对临时表进行添加索引。高并发

  3. 再将原始表中的数据逐条Copy到临时表中。spa

  4. 当原始表中的全部记录都被Copy临时表后,将原始表进行删除。插件

  5. 再将临时表命名为原始表表名。设计

从上面咱们能够看出:索引建立一共经历了五个步骤,才能加上索引,当数据量比较大时,光复制就须要大量的时间。在复制过程当中,还对原始表进行了写锁操做,致使 insert,delete,update 语句均不能执行。处于等待状态。对于高并发应用来讲,这是不容许的。也就致使在MySQL 5.5以前版本,线上添加,修改索引是一个极其痛苦的操做。3d

注意:(图中括号内的关键字,并不表明MySQL内部采用该行为,只是我为了更容易理解,才添加。不要误解。)code

快速索引建立

  快速索引建立原名为:『 fast index creation 』,主要是由于在MySQL 5.5及更高版本(InnoDB插件的MySQL 5.1)上建立,删除二级索引,不须要建立临时表,复制数据等操做,提升了操做效率。其内部实现步骤为:

  1. 发起删除索引操做。

  2. 通知InnoDB系统表和MySQL数据字典表,该索引已标识为失效状态。

  3. InnoDB将索引所占空间回收至表空间中,以便后续索引,表记录使用。

在这里,咱们知道因为二级索引只包含了索引键和主键值,因此在建立,删除时不须要进行数据复制,从而不会进行锁表。也就容许线上DML操做。不影响生产使用。

对于聚簇索引则不一样,其包含了B树节点中的数据值,因此,建立修改时,就涉及到了临时表的建立,数据复制等,因此其成本也是很是高的。

聚簇索引&二级索引

  上面提到了聚簇索引和二级索引,其实呀,仍是比较好理解的,下面分别介绍一下:

聚簇索引

  其实就是咱们常见的主键索引,是InnoDB存储引擎中对主键索引的别名而已。表中记录的存储都是按照主键列进行有序组织的,主键索引的添加,删除操做成本是很是高的。要通过: 建立临时表,复制数据等一系列操做。

二级索引

  二级索引就是咱们常见字段上的索引,因为二级索引的建立,删除,不涉及建立临时表,复制数据等操做,因此其修改为本相对低不少。效率也更高!
以下所示:

alter table t_base_user add idx_name(name);

今日命令

命令: show create table t_base_user;
做用: 显示表的建立语句。
例如:

mysql> show create table t_base_user \G
*************************** 1. row ***************************
       Table: t_base_user
Create Table: CREATE TABLE `t_base_user` (
  `oid` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'name',
  `email` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'email',
  `age` int(11) DEFAULT NULL COMMENT 'age',
  `telephone` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'telephone',
  `status` tinyint(4) DEFAULT '0',
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`oid`),
  UNIQUE KEY `idx_email` (`email`),
  KEY `idx_name` (`name`),
  KEY `idx_telephone` (`telephone`),
  KEY `idx_email_name` (`email`,`name`) COMMENT 'remark'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)

从上面信息中,咱们不只能够知道每列属性(列名,字段长度,默认值,字符集),还能够知道该表的索引信息,存储引擎信息,字符集信息。是否是颇有帮助呢?

应用场景:咱们可使用该语句,来查看该表的建表信息,表的存储引擎信息,在实际工做中,很是有用。

小结

  也许会有人说,这篇文章说的都是 Fast Index Creation (在线索引建立)和在线DDL有什么关系?其实否则,在 MySQL 5.6 开始,Fast Index Creation (快速索引建立)已升级为Online DDL了,开放了更多的在线DDL操做,咱们也再也不为生产中执行DDL操做而犯愁了。不过,不是全部的DDL操做都支持在线操做的,咱们在下一篇文章《浅谈MySQL Online DDL(下)》继续说,尽请期待!

 

相关阅读:

写会MySQL索引

读懂MySQL执行计划

MySQL表设计踩过的坑!

MySQL事务隔离级别

 

扫码关注,一块儿进步

我的博客: http://www.andyqian.com

相关文章
相关标签/搜索