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. 高频交易算法研发心得--MACD指标算法及应用

    凤鸾宝帐景非常,尽是泥金巧样妆. 曲曲远山飞翠色:翩翩舞袖映霞裳. 梨花带雨争娇艳:芍药笼烟骋媚妆. 但得妖娆能举动,取回长乐侍君王. [摘自<封神演义>纣王在女娲宫上香时题的诗] 一首定 ...

  2. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

  3. 云计算下PAAS的解析一

    云计算下PAAS的解析一       PaaS是Platform-as-a-Service的缩写,意思是平台即服务. 把服务器平台作为一种服务提供的商业模式.通过网络进行程序提供的服务称之为SaaS( ...

  4. java web学习总结(五) -------------------servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  5. Kotlin中变量不同于Java: var 对val(KAD 02)

    原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 时间:Nov 28, 201 ...

  6. iOS app内存分析套路

    iOS app内存分析套路 Xcode下查看app内存使用情况有2中方法: Navigator导航栏中的Debug navigator中的Memory Instruments 一.Debug navi ...

  7. Mysql 忘记root密码处理办法

    一.更改my.cnf配置文件 1.用命令编辑/etc/my.cnf配置文件,即:vim /etc/my.cnf 或者 vi /etc/my.cnf 2.在[mysqld]下添加skip-grant-t ...

  8. SQL 提示介绍 hash/merge/concat union

    查询提示一直是个很有争议的东西,因为他影响了sql server 自己选择执行计划.很多人在问是否应该使用查询提示的时候一般会被告知慎用或不要使用...但是个人认为善用提示在不修改语句的条件下,是常用 ...

  9. 希尔排序(java)

    时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++ ...

  10. VS2010 release编译下进行调试,“当前不会命中任何断点,还没有为文档加载”问题解决方案

    在release模式下调试程序,经常出现"当前不会命中任何断点,还没有为文档加载"的问题,可尝试以下方法: 1. 属性 → 配置属性 → C/C++ → 常规 → 调试信息格式:选 ...