美文网首页
MySQL create table t2 as select

MySQL create table t2 as select

作者: 月饮沙 | 来源:发表于2021-04-21 15:22 被阅读0次

    背景

    数据库配置:binlog_format = row

    故障原因

    在主库执行了以下语句导致延迟

    create table t2 as select t1
    update t2 set column1=value where column2=value2
    

    分析

    1. 关于复制原理
      MySQL的复制是基于binlog的,对于binlog_format=row的数据库,binlog里面记录的是每行数据的更改,也就是说,当执行一个更新语句时,语句更新了N行,就会在日志中存在N行记录。
      在从库应用日志时,会对binlog中的每一条记录进行应用,也就是说,主库上的一条更新语句=从库上的N条更新语句
    2. 关于数据更新
      数据更新时要先查找到要更新的数据,如果表不存在索引,会进行全表扫描,找到要更新的数据并进行更新
      当表数据量很大时,全表扫描会消耗大量资源。

    在这个问题中,使用create table t2 as select t1复制了表t1的数据到t2中,但是,使用这个语句复制的表t2,是不包括t1的索引信息的,也就是说,后续更新t2时,是在一个无索引的大表中执行更新,在从库上要执行多次全表扫描来更新数据,所以最终导致的从库同步延迟

    后续规避方法

    create table t2 as select t1
    

    替换为

    create table t2 like t1
    insert into t2 select * from t1
    

    使用这种方法,也能够创建一个和表t1内容相同的表,并且t2会复制t1的索引信息

    相关文章

      网友评论

          本文标题:MySQL create table t2 as select

          本文链接:https://www.haomeiwen.com/subject/iqzalltx.html