虽然FIC可以让InnoDB存储引擎免创建临时表,从而提高索引创建的效率。但正如前面所说,索引创建时会阻塞表上的DML操作。OSC虽然解决了上述的部分问题,但是还是有很大的局限性。MySQL5.6版本可以支持Online DDL(在线数据定义)操作,其允许辅助索引创建的同时,还允许其他诸如INSERT UPDATE DELETE这类的DML操作。这几大提高了MySQL数据库在生产环境中的可用性
此外,不仅是辅助索引,以及这几类的DDL操作都可以通过在线的方式进行操作
辅助索引的创建与删除
改变自增长值
添加或删除外键约束
列的重命名
通过新的ALTER TABLE语法,用户可以选择索引的创建方式:
ALGORITHM指定了创建或删除索引的算法,COPY表示按照MySQL5.1版本之前的工作模式,即创建临时表的方式.INPLACE表示索引创建或删除操作不需要创建临时表。DEFAULT表示根据参数old_alter_table来判断是通过INPLACE还是COPY的算法,该参数的默认值为OFF,表示采用INPLACE的方式
LOCK部分为索引创建或删除时对表添加锁的情况 可有的选择为:
a)NONE
执行索引创建或删除操作时,对目标表不添加任何的锁,即事务依然可以进行读写操作,不会有收到阻塞。因此这种模式可以获得更大的并发度
b)SHARE
这和之前的FIC类似,执行索引创建或删除操作时,对目标表加上一个S锁。对于并发的读事务,依然可以执行,但是遇到写事务,就会发生等待操作,如果存储引擎不支持SHARE模式,会返回一个错误信息
c)EXCLUSIVE
在这个模式下,执行索引创建或删除操作时,对目标表加上一个X锁。读写事务都不能进行。因此会阻塞所有的线程。这和COPY方式运行得到的状态类似。但不需要像COPY那样创建一张临时表
d)DEFAULT
首先会判断当前的操作是否使用了NONE模式,若不能则判断是否使用SHARE模式,最后判断是否使用了EXCLUSIVE模式也就是说DEFAULT会通过判断事务的最大并发性来判断执行DDL模式
InnoDB存储引擎实现Online DDL的原理是在执行创建或删除操作的同时,将INSERT/UPDATE/DELETE这类的DML操作日志写入到一个缓存中。待完成索引创建后再重做应用到表上。以此达到数据的一致性。这个缓存大小由innodb_online_alter_log_max_size控制,默认128MB。若用户更新的表比较大,在创建过程中伴有大量的写事务,如遇到innodb_online_alter_log_max_size的空间不能存放日志是,会抛出
对于这个操作,可以跳大参数innodb_online_alter_log_max_size,一次获得更大的日志缓存空间。此外,还可以设置ALTER TABLE的模式为SHARE。这样在执行过程中就不会有写事务发生。因此不需要进行DML日志的记录
需要特别注意,由于Online DDL在创建索引完成后在通过重做日志达到数据库的最终一致性。这意味着在索引创建过程中,SQL优化器不会选择正在创建中的索引