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. Oracle 的基本操作符

    != 不等于 select empno,ename,job from scott.emp where job!='manager' ^= 不等于 select empno,ename,job from ...

  2. 在 Laravel 中使用图片处理库 Integration/Image

    系统需求 PHP >= 5.3 Fileinfo Extension GD Library (>=2.0) … or … Imagick PHP extension (>=6.5.7 ...

  3. NET Core-TagHelper实现分页标签

    这里将要和大家分享的是学习总结使用TagHelper实现分页标签,之前分享过一篇使用HtmlHelper扩展了一个分页写法地址可以点击这里http://www.cnblogs.com/wangrudo ...

  4. 【Web动画】SVG 线条动画入门

    通常我们说的 Web 动画,包含了三大类. CSS3 动画 javascript 动画(canvas) html 动画(SVG) 个人认为 3 种动画各有优劣,实际应用中根据掌握情况作出取舍,本文讨论 ...

  5. 使用C/C++写Python模块

    最近看开源项目时学习了一下用C/C++写python模块,顺便把学习进行一下总结,废话少说直接开始: 环境:windows.python2.78.VS2010或MingW 1 创建VC工程 (1) 打 ...

  6. SDWebImage源码解读之SDWebImageCache(上)

    第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...

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

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

  8. form表单验证-Javascript

    Form表单验证: js基础考试内容,form表单验证,正则表达式,blur事件,自动获取数组,以及css布局样式,动态清除等.完整代码如下: <!DOCTYPE html PUBLIC &qu ...

  9. 编译器开发系列--Ocelot语言6.静态类型检查

    关于"静态类型检查",想必使用C 或Java 的各位应该非常熟悉了.在此过程中将检查表达式的类型,发现类型不正确的操作时就会报错.例如结构体之间无法用+ 进行加法运算,指针和数值之 ...

  10. Android Weekly Notes Issue #236

    Android Weekly Issue #236 December 18th, 2016 Android Weekly Issue #236 本期内容包括: Google的物联网平台Android ...