返回顶部
首页 > 资讯 > 数据库 >MySQL 8.0 Online DDL快速加列的相关总结
  • 156
分享到

MySQL 8.0 Online DDL快速加列的相关总结

MySQL快速加列MySQLOnlineDDL 2022-05-25 20:05:21 156人浏览 八月长安
摘要

目录问题描述Mysql Online DDL加列的历史方法01 Copy方法02 Inplace方法mysql8.0.12 引入的Instant方法问题描述 前几天同事问了我一个问题:业务A从Mysql迁移到mong

目录
  • 问题描述
  • Mysql Online DDL加列的历史方法
    • 01 Copy方法
    • 02 Inplace方法
  • mysql8.0.12 引入的Instant方法

    问题描述

    前几天同事问了我一个问题:业务A从Mysql迁移到mongoDB的原因是什么?

    说实话,这个问题还真不好回答,为什么要迁移,一定是遇到了某种瓶颈,可能是数据量也可能是数据类型等,于是我咨询了一下业务,最终得到了答案:这个业务中的某些表,要频繁的加字段。monGodb中加字段的成本几乎没有,而MySQL低版本中加字段的成本还是挺高的。

    那么常用的MySQL添加字段的方法有哪些呢?这里我简单列举一下:

    percona的pt-osc工具

    GitHub开源项目gh-ost工具

    MySQL原生Online DDL

    MySQL Online DDL加列的历史方法

    01 Copy方法

    MySQL5.5版本及之前的加列方法:Copy

    它的执行示意图如下:

    我们有一个原表A,只包含1个字段,它包含1、2、4、6这几条记录,当我们使用Copy算法加列时:

    创建了一个新的表tmp-A,新表包含2个字段,

    然后我们把表A的数据全部逐行拷贝到tmp-A这个新表里面,

    然后用tmp-A表和A表做个交换,

        这样,我们的新表就包含2个字段了。同时需要注意,新表中的数据记录比原表更加紧凑了。原表中可能由于删除了3和5两条记录,使得表中间留下了空洞,或者叫空间碎片。

        可以看到,Copy算法需要拷贝一遍数据,需要额外的存储空间来存储tmp-A这个临时表。另外,在拷贝数据的过程中,表A的写入操作会丢失,也就是说,表A在alter table的过程中不能有数据更新。这可能是一个致命的缺点。

    02 Inplace方法

    MySQL5.6版本开始引入Online DDL,这个功能使得上面的过程变成了下面这样:

     它的过程和上面的Copy算法有些不同:

    Online DDL过程中,从表A提取B+树,并存储到一个中间文件tmp-file,而不是中间表tmp-A

    步骤1执行过程中,对表A的写入,都会记录到row log中

    步骤1执行完毕后,对tmp-file应用所有的row log,得到一个与表A数据相同的数据文件

    利用数据文件tmp-file替换表A的数据文件即可。

        这个过程中,由于row log的存在,使得在整个该表过程中,表A是可以进行增删改查的操作的,因为这些操作不会丢失。这也就是为什么把这个过程叫做Online DDL的原因。

        另外,这里需要解释下,Copy算法中生成的tmp-A临时表是在Server层面创建的,而上述Online DDL操作中的tmp-file是在插件式存储引擎Innodb内部生成的,我们把这种在Innodb内部完成的变更操作,称之为Inplace(中文表示原地),也就是不需要将数据挪动到"server层的临时表"。

    MySQL8.0.12 引入的Instant方法

        MySQL8.0.12版本引入了Instant的方法,它让加列变得更加简单。instant算法添加列时不再需要 rebuild 整个表,只需要在表的 metadata 中记录新增列的基本信息即可。

        我们来看它的优势,首先我们创建一个表t1,并插入26w条数据,然后分别添加数据列col_1,col_2,col_3,并显示指定加列的算法为copy、inplace、和instant,结果如下:

    
     [test] 23:42:45> select count(1) from t1;
     +----------+
     | count(1) |
     +----------+
     |   262144 |
     +----------+
     1 row in set (0.06 sec)
     
    方案一:copy
    [test] 23:43:29> alter table t1 add col_1 int,algorithm=copy;  
    Query OK, 262144 rows affected (1.48 sec)
    Records: 262144  Duplicates: 0  Warnings: 0
    
    方案二:inplace
    [test] 23:43:46> alter table t1 add col_2 int,algorithm=inplace; 
    Query OK, 0 rows affected (0.58 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    方案三:instant
    [test] 23:44:08> alter table t1 add col_3 int,algorithm=instant; 
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    m5480:mysqlha_common@10.41.28.124 [test] 23:44:14> show create table t1\G
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
      `age` int DEFAULT NULL,
      `score` int DEFAULT NULL,
      `col_1` int DEFAULT NULL,
      `col_2` int DEFAULT NULL,
      `col_3` int DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `idx_sco` (`score`)
    ) ENGINE=InnoDB AUTO_INCREMENT=458730 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
    1 row in set (0.01 sec)

       从结果不难看出,执行时间上:

    copy> inplace > instant

    与此同时,copy算法的受影响行数是全部表,而inplace和instant的算法影响的行数都是0,说明他们是Online DDL操作。 

        最后,我们还可以通过下面的方法查看instant列的信息:

    
    [test] 23:53:01> SELECT * FROM infORMation_schema.innodb_tables where name like 'test/t1'\G
     *************************** 1. row ***************************
          TABLE_ID: 1079
              NAME: test/t1
              FLAG: 33
            N_COLS: 10
             SPACE: 22
        ROW_FORMAT: Dynamic
     ZIP_PAGE_SIZE: 0
       SPACE_TYPE: Single
     INSTANT_COLS: 6
    1 row in set (0.00 sec)

        可以看到,test.t1这个表的instant列序号是6,代表它是这个表的第7个列(列编号从0开始)。

        当然,instant算法不支持删除普通列、无法设置列的顺序、还有一些其他的限制,详情可以查看官方文档:https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html

        但这些限制并不影响它成为一个优秀的DDL功能。 相信通过MySQL版本的不断迭代,在后面的版本中,有更多的变更操作可以用到instant这种高效的算法。

    以上就是MySQL 8.0 Online DDL快速加列的相关总结的详细内容,更多关于MySQL DDL快速加列的资料请关注自学编程网其它相关文章!

    您可能感兴趣的文档:

    --结束END--

    本文标题: MySQL 8.0 Online DDL快速加列的相关总结

    本文链接: https://lsjlt.com/news/10389.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • MySQL 8.0 Online DDL快速加列的相关总结
      目录问题描述MySQL Online DDL加列的历史方法01 Copy方法02 Inplace方法MySQL8.0.12 引入的Instant方法问题描述 前几天同事问了我一个问题:业务A从MySQL迁移到Mong...
      99+
      2022-05-25
      MySQL 快速加列 MySQL Online DDL
    • MySQL Online DDL与DML并发阻塞关系总结
      MySQL DDL操作执行的三种方式 1,INPLACE,在进行DDL操作时,不影响表的读&写,可以正常执行表上的DML操作,避免与COPY方法相关的磁盘I/O和CPU周期,从而最小化数据库的总体负载。 最小化负载有助于在DDL操作期间保持...
      99+
      2017-11-12
      MySQL Online DDL与DML并发阻塞关系总结
    • MySQL InnoDB 锁的相关总结
      1.  Shared and Exclusive Locks shared lock (译:共享锁) exclusive lock (译:排它锁、独占锁) InnoDB实现了标准的行级锁,其中有两种类型的锁...
      99+
      2022-05-16
      MySQL InnoDB InnoDB锁
    • mysql的相关设置总结
      下文给大家带来关于mysql的相关设置总结,感兴趣的话就一起来看看这篇文章吧,相信看完mysql的相关设置总结对大家多少有点帮助吧。1.安装MySQL    使用管理...
      99+
      2024-04-02
    • MySQL 锁的相关知识总结
      MySQL中的锁 锁是为了解决并发环境下资源竞争的手段,其中乐观并发控制,悲观并发控制和多版本并发控制是数据库并发控制主要采用的技术手段(具体可见我之前的文章),而MySQL中的锁就是其中的悲观并发控制。 MySQ...
      99+
      2022-05-14
      MySQL
    • MySQL InnoDB架构的相关总结
      目录引言1、Mysql数据库整体架构SQL接口解析器优化器执行器存储引擎2、InnoDB存储引擎架构内存缓冲池undo log日志文件redolog日志文件binlog日志文件InnoDB执行流程引言 作为一个后端...
      99+
      2022-05-28
      MySQL InnoDB MySQL InnoDB架构
    • 【mysql】索引相关的个人总结
      重点参考: MySQL索引原理及慢查询优化 (美团技术分享网站):原理、示例优化都写的很好。 索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!:原理写的很好。 【从入门到入土】令人脱发的数据库底层设计:很详细...
      99+
      2016-06-26
      【mysql】索引相关的个人总结
    • Mysql 查询JSON结果的相关函数汇总
      JSON 格式字段是 Mysql 5.7 新加的属性,不够它本质上以字符串性质保存在库中的,刚接触时我只了解 $.xx 查询字段的方法,因为大部分时间,有这个就够了,其他交给程序就行了,但是最近一些操作需要更复杂的查...
      99+
      2022-05-19
      MySQL json MySQL json有关函数 MySQL 查询json
    • MySQL 逻辑备份与恢复测试的相关总结
      目录一、什么样的备份是数据库逻辑备份呢?二、常用的逻辑备份①生成 INSERT 语句备份②生成特定格式的纯文本备份数据文件备份1.通过执行 SELECT ... TO OUTFILE FROM ......
      99+
      2022-05-29
      MySQL 逻辑备份 MySQL 恢复测试
    • MySQL的几个和innodb相关的主要参数设置总结
      1).innodb_buffer_pool_size 为了提升性能,可以把要写的数据先在缓冲区buffer里合并,然后再发送给下一级存储。这样做可以提高I/O读写的效率。 InnoDB Buffer Poo...
      99+
      2024-04-02
    • MySQL系列关于NUll值的经验总结分析教程
      目录1.测试数据2.null值带给我们的不便影响3.空格、空值和null,我们应该怎么判断呢?1)空格、空值和null的区别2)出现了null值,我应该怎么办?1.测试数据 cr...
      99+
      2024-04-02
    • 关于MySQL InnoDB表的二级索引是否加入主键的总结
      1.对于MySQL InnoDB表的二级索引是否加入主键,官方也有明确的说明,建议线上MySQL的二级索引创建时强制加入主键所有的列,可以做到所有的MySQL 版本统一。 2.MySQL 5.6.9之前...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作