Innodb性能改善方面:

  --Users can add indexes and perform standard table alterations while the database remains available for application updates。
  支持在线操作(add index、alter table):

例子一:在线添加索引
开启一个session,对italk库下的data_userinfo表做创建索引的操作,(该表大概70万数据):
mysql>>create index idx_groupid on data_userinfo(groupid);
Query OK, 0 rows affected (9.26 sec)
Records: 0 Duplicates: 0 Warnings: 0
同时在另外一个session中,执行对该表的update操作:
mysql>>update data_userinfo set status=1 where id=22;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
update操作立即返回结果,在之前的版本中,由于创建索引以及alter table 是表级锁,该update只能等待添加索引的语句完成后才能执行,show full processlist状态显示为:
Waiting for table metadata lock | update data_userinfo set status=2 where id=22

Alter table 添加索引形式:
mysql>>alter table data_userinfo add index idx_groupid (groupid);
Query OK, 0 rows affected (12.77 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>>update data_userinfo set status=2 where id=23;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0

例子二:在线添加列字段
mysql>>alter table data_userinfo add age int unsigned not null default 0;
Query OK, 0 rows affected (57.71 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>>update data_userinfo set status=1 where id=23;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

例子三:改变列字段的数据类型
Changing the data type of a column (takes substantial time and does require rebuilding all the rows of the table):
会花费大量时间,并且会重建表中所有行数据
Query OK, 668200 rows affected (1 min 35.54 sec)

当你对一个大表进行DDL操作,可以通过如下步骤来判断该操作是快速执行还是执行比较慢:
1、克隆原表的表结构
2、用原来的一小部分数据来填充克隆表
3、在克隆表上执行DDL操作
4、检查rows affected是0还是非0.如果是非0,意味着该DDL操作将要重建表中所有行数据,也就意味着你须要安排计划一个业务低峰值的时间或者在
slave上进行该DDL操作

性能基准测试

可以通过在最新版本5.6和较老版本中对一个较大的innodb表执行相同的alter操作,测试在线DDL操作的相关性能
mysql--root@localhost:italk 17:45:09>>set old_alter_table=1; -------------设置为在旧模式下
Query OK, 0 rows affected (0.00 sec)

mysql--root@localhost:italk 17:45:30>>alter table data_userinfo add index idx_groupid (groupid);
Query OK, 668200 rows affected (42.05 sec) -------------performs a table copy通过copy表数据完成,受影响行数是所有行
Records: 668200 Duplicates: 0 Warnings: 0

mysql--root@localhost:italk 17:46:28>>set old_alter_table=0; -------------设置为在最新模式下
Query OK, 0 rows affected (0.00 sec)

mysql--root@localhost:italk 17:46:54>>alter table data_userinfo add index idx_groupid (groupid);
Query OK, 0 rows affected (10.67 sec) -------------changes in-place 就地更改,不影响行数据
Records: 0 Duplicates: 0 Warnings: 0

通过耗时我们可以看到操作时间大大减少,性能明显提高不少。

5.6的alter table语法中新增了算法选项和锁选项:
algorithm_option:
ALGORITHM [=] {DEFAULT|INPLACE|COPY}

lock_option:
LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}
可以通过这2个选项来控制你的DDL操作是in-place模式还是旧的那种copy the table 的模式

思考题:

1.为什么删除index如此快速?

答:删除index时只是在辅助索引的空间上做个可用标志。并删除该表的索引定义,没有新建表。

2.innodb中index存哪里

分析innodb会发现,索引是存在于新的page中,不与数据一起存储在同一pageh中。辅助索引page中存的是索引行的值以及主键的值。

3.通过什么来保证在线添加index和update数据双方不受影响?

答:MySQL5.6中通过row_log来保证数据的一致性,且双方不受影响。

Online Add Index处理流程

  • 判断DML是否可以用inplace进行(不新建表)
  • 开始进行online操作前期准备

    (1.修改表的数据字典信息

    (2.等待后台所有线程停止操作此表

    (3.online过程中,原表允许读写,所以需要将DML操作的数据记录到row_log中,不在索引上进行更新

  • 开始进行真正的online add index操作

    (1.读取聚簇索引、排序、并插入到新建索引中,并且将row log中的记录变化,更新到新建索引中

    (2.插入新索引完成后,将这期间记录在row_log的记录变化重新运用

    (3.新建索引短暂加锁

Mysql5.6 online ddl的更多相关文章

  1. MySQL5.6在线DDL不锁表(在线添加字段)

    解答你也看一下MySQL5.6在线DDL不锁表,现在我有一张1亿的表,需要增加一个字段,假如我让你去增加这个字段,你应该注意什么,具体怎么操作? 操作如下:1.注意磁盘空间(临时表目录 参数 tmpd ...

  2. mysql5.6 online ddl—索引

    尝试对mysiam表(1500万)删除索引失败 #uk表字段类型比较简单,都是int/tinyint/timestamp类型. CREATE TABLE `uk` (  `id` int(11) NO ...

  3. MySQL5.6 ALTER TABLE 分析和测试

    在MySQL5.5和之前版本,在运行的生产环境对大表(超过数百万纪录)执行Alter操作是一件很困难的事情.因为将重建表和锁表,影响用户者的使用.因此知道Alter操作何时结束对我们是非常重要的.甚至 ...

  4. 【mysql】数据库中的DML DDL DCL TCL 及 Online DDL

    DDL(data definition language) : 数据库定义语言 用来定义创建操作表的时候用到的一些sql命令,比如CREATE.ALTER.DROP等等. DML(data manip ...

  5. Online DDL工具的安装与使用

    最近经常在线上经常遇到有性能问题的SQL,有些表没有合理添加索引,有些表添加的索引不合理,各种各样的问题,导致SQL的执行效率不高.这时DBA们不得不重构SQL,使其达到最好的性能,这时我们往往要在线 ...

  6. MySQL DDL方案测试及选型.

    性能测试 一.测试背景 1.机器配置和版本 机器配置(下面测试qps数据都是以本机器配置为准) 型号:Dell s3710 磁盘:SSD 3T CPU:32 内存:128G MySQL版本:5.7.2 ...

  7. MySQL-8.0.x DDL 原子性

    [1.mysql-8.0.x 新特性之 DDL 原子性] 在没有 DDL 原子性之前 DBA 对 DDL 语句基本上是无能为力的,比如说 DDL 执行的过程中停电了,这下就只有天知道了.实现上最终的愿 ...

  8. MySQL OSC(在线更改表结构)原理

    1 OSC介绍 在我们的数据库操作中,更改表结构是一个常见的操作,而当我们的表数据量非常大时,我们更改表结构的时间是非 常的长,并且在跟改期间,会生成一个互斥锁,阻塞对整个表的所有操作,这样,对于我们 ...

  9. MySQL基础普及《MySQL管理之道:性能调优、高可用与监控》

    最近工作的内容涉及MySQL运维内容,陆陆续续读了几本相关的书,其中一本是<MySQL管理之道:性能调优.高可用与监控>. 内容涵盖性能调优(包括sql优化等).备份.高可用,以及读写分离 ...

随机推荐

  1. 有趣的 CSS 像素艺术

    原文地址:https://css-tricks.com/fun-times-css-pixel-art/#article-header-id-4 译者:nzbin 友情提示:由于国内网络的原因,Cod ...

  2. virtualbox linux虚拟机相关

    linux虚拟机设置为静态IP 在virtualbox中安装好linux虚拟机后,如果采用的是NAT方式的话,linux虚拟机默认采用dhcp方式自动上网,而且用的是NetworkManager服务而 ...

  3. 浅谈web攻防

    CSRF 跨站请求伪造(Cross-Site Request Forgery) -原理- 从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤: 1.登录受信任网站A,并在本地生成Coo ...

  4. Linux学习之文件操作

    Linux,一起学习进步-    mkdir The mkdir command is used to create directories.It works like this: mkdir命令是用 ...

  5. 趣说游戏AI开发:曼哈顿街角的A*算法

    0x00 前言 请叫我标题党!请叫我标题党!请叫我标题党!因为下面的文字既不发生在美国曼哈顿,也不是一个讲述美国梦的故事.相反,这可能只是一篇没有那么枯燥的关于算法的文章.A星算法,这个在游戏寻路开发 ...

  6. [原] KVM 虚拟化原理探究(4)— 内存虚拟化

    KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...

  7. 新手学习web遇到的一些乱码问题

    在新手学习web网站学习的时候经常会遇到?????这种乱码,对于刚起步的菜鸟来说真的很头痛,很容易打击继续学的信心当然了对于菜鸟的我最近也遇到过乱码问题,沉浸其中不能自拔,爱的深啊!!!!!我所遇到的 ...

  8. 【JS基础】对象

    delete 可以删除对象属性及变量 function fun(){ this.name = 'mm'; } var obj = new fun(); console.log(obj.name);// ...

  9. Android—应用程序开机自启

    android开机时候会发送开机广播,我们想要收到广播知道手机开机,才能启动我们的应用程序. 首先要在配置文件中添加相应权限: <uses-permission android:name=&qu ...

  10. Linux课堂笔记(一)

    一.Linux应用领域及版本介绍. 1.服务器.嵌入式.桌面应用等. (1)在服务器领域中,需要安全和稳定,特别是越老的内核版本越安全.越稳定. (2)Linux主要分内核版和发行版. 内核版本2.6 ...