①:复制表方式:这是InnoDB最早支持的方式,顾名思义,通过临时表拷贝的方式实现的。新建一个带有新结构的临时表,将原表数据全部拷贝到临,,,,,,,,,,时表,然后重命名,完成创建操作。这个方式过程中,原表是可读的,不可写。但是会消耗一倍的存储空间。
②:原地方式:这是原生MySQL 5.5,以及innodb_plugin中提供的方式。所谓原地,也就是在原表上直接进行,不会拷贝临时表。相对于复制,,,,,,,,,,,,表方式,这比较高效率。原表同样可读的,但是不可写。
③:在线方式:这是MySQL 5.6以上版本中提供的方式,也是今天我们重点说明的方式,无论是复制表方式,还是原地方式,原表只能允许读取,,,,,,不可写。对应用有较大的限制,因此MySQL最新版本中,InnoDB支持了所谓的在线方式DDL。与以上两种方式相比,在线方式支持DDL时不仅可,,,,,以读,还可以写,对于dba来说,这是一个非常棒的改进。
算法=复制,需要拷贝原始表,所以不允许并发DML写操作,可读。这种复制方式的效率还是不如原地,因为前者需要记录撤销和重做日志,而且因为临时占用缓冲池引起短时间内性能受影响。
①:就地为是的是优选项,说明该操作支持原地
②:复制表为没有是优选项,因为为是的需要重建表。大部分情况与就地是相反的
③:允许并发DML吗?为是的是优选项,说明ddl期间表依然可读写,可以指定锁=NONE(如果操作允许的话mysql自动就是NONE)
④:允许并发查询?默认所有ddl操作期间都允许查询请求,放在这只是便于参考
,,,,,,,,,,,,,,,,,,,,,,,
1)在alter table时,如果涉及到表拷贝操作,要确保datadir目录有足够的磁盘空间,能够放的下整张表,因为拷贝表的的操作是直接在数据目录下进行的只,,,,,,,,,,,,,,,, (mysql@localhost ~),美元mysql -u root - p 密码:Enter Welcome 用,MariaDB 监控只,Commands 最终获得with ,趁机\ g。 Your MySQL  connection id  is 9 版本:Server 5.7.18-log MySQL  Community Server (GPL) Copyright (c), 2000年,2014年,甲骨文,MariaDB Corporation Ab 以及其他信息。 Type & # 39;帮助;& # 39;,趁机& # 39;\ h # 39;, for 帮助只Type & # 39; \ c # 39;,用clear 从而current input 语句。
MySQL [(一)]祝辞,create database 测试; Query 好吧,,1,row affected (0.07,秒) MySQL [(一)]祝辞use 测试 Database 改变了 MySQL [测试]祝辞,create table test_emp (int, id  (10), unsigned NOT NULL AUTO_INCREMENT,, c1 int (10), NOT NULL DEFAULT & # 39; 0 & # 39;, ,,,,,,c2 int (10), unsigned DEFAULT 空,,c5 int (10), unsigned NOT NULL DEFAULT & # 39; 0 & # 39;,, c3 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 提醒UPDATE CURRENT_TIMESTAMP, ,,,,,c4 varchar (200), NOT NULL DEFAULT & # 39; & # 39;, PRIMARY 关键(id), KEY idx_c1 (c1), KEY idx_c2 (c2),)引擎=InnoDB ; Query 好吧,,0,rows affected (0.11,秒),,,- - - - -创建测试表:test_emp MySQL [测试]祝辞delimiter //MySQL [测试]祝辞,create procedure insert_test_emp (row_num 拷贝;int ) ,,,→开始 ,,,,,,declare 小姐:int , default 0; ,,,,,,while 小姐:& lt; row_num 做 ,,,,,insert into test_emp (c5, c1, c2, c3, c4),值(,地板(rand () * row_num),地板(rand () * row_num),地板(rand () * row_num)、现在(),重复(& # 39;苏# 39;,,地板(rand () * 20))); ,,,,,set 小姐:=,+ 1; ,,,,,,最终获得的同时; ,,,→结束 ,,,→//Query 好吧,,0,rows affected (0.01,秒) MySQL [测试]祝辞, MySQL [测试]祝辞,call insert_test_emp(100000);,,, - - - - -向测试表test_emp插入数据 Query 好吧,,1,row affected (8, min 24.34, sec) MySQL [测试]祝辞,desc test_emp; null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nullMySQL5.7在线DDL相关知识简单介绍