• MySQL Online DDL


    虽然FIC可以让InnoDB存储引擎免创建临时表,从而提高索引创建的效率。但正如前面所说,索引创建时会阻塞表上的DML操作。OSC虽然解决了上述的部分问题,但是还是有很大的局限性。MySQL5.6版本可以支持Online DDL(在线数据定义)操作,其允许辅助索引创建的同时,还允许其他诸如INSERT UPDATE DELETE这类的DML操作。这几大提高了MySQL数据库在生产环境中的可用性

    此外,不仅是辅助索引,以及这几类的DDL操作都可以通过在线的方式进行操作

    辅助索引的创建与删除

    改变自增长值

    添加或删除外键约束

    列的重命名

    通过新的ALTER TABLE语法,用户可以选择索引的创建方式:

    QQ图片20160118092922

    ALGORITHM指定了创建或删除索引的算法,COPY表示按照MySQL5.1版本之前的工作模式,即创建临时表的方式.INPLACE表示索引创建或删除操作不需要创建临时表。DEFAULT表示根据参数old_alter_table来判断是通过INPLACE还是COPY的算法,该参数的默认值为OFF,表示采用INPLACE的方式

    image

    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的空间不能存放日志是,会抛出

    image

    对于这个操作,可以跳大参数innodb_online_alter_log_max_size,一次获得更大的日志缓存空间。此外,还可以设置ALTER TABLE的模式为SHARE。这样在执行过程中就不会有写事务发生。因此不需要进行DML日志的记录

    需要特别注意,由于Online DDL在创建索引完成后在通过重做日志达到数据库的最终一致性。这意味着在索引创建过程中,SQL优化器不会选择正在创建中的索引

  • 相关阅读:
    MySQL字段数据全部查出【只保留中文、英文、数字、空格的词表】
    MySQL查看当前运行的事务和执行的账户
    【转】【MySQL报错】ERROR 1558 (HY000): Column count of mysql.user is wrong. Expected 43, found 39.
    【转】mysqldump的锁表的问题
    mysql 通过echo的方式写入数据库 中文乱码解决方案
    Python3.5爬取豆瓣电视剧数据并且同步到mysql中
    Python3.5爬取cbooo.cn数据并且同步到mysql中
    【转&参考】MySQL利用frm和ibd文件进行数据恢复
    [算法]从一道题引出variable-precision SWAR算法
    [转]nginx负载均衡的五种算法
  • 原文地址:https://www.cnblogs.com/olinux/p/5138349.html
Copyright © 2020-2023  润新知