zoukankan      html  css  js  c++  java
  • mysql问题: alter导致速度慢

    1 如何并行执行。

    数据库里有一个数据量非常大的表,当对这个表进行alter的时候,这时候该表是只读的,由于数据量很大alter时间很长,如果这时候有insert或update操作,有什么办法在这期间可以进行insert或update操作?

    MySQL在被alter时是可以insert和update的,但是操作会被延迟。以下我引用MySQL官网的解释:
    *“ALTER TABLE运行时会对原表进行临时复制,在副本上进行更改,然后删除原表,再对新表进行重命名。在执行ALTER TABLE时,其它用户可以阅读原表,但是对表的更新和修改的操作将被延迟,直到新表生成为止。新表生成后,这些更新和修改信息会自动转移到新表上。

    注意,如果您在执行ALTER TABLE时使用除了RENAME以外的选项,则MySQL会创建一个临时表。即使数据并不需要进行复制(例如当您更改列的名称时),MySQL也会这么操作。对于MyISAM表,您可以通过把myisam_sort_buffer_size系统变量设置到一个较高的值,来加快重新创建索引(该操作是变更过程中速度最慢的一部分)的速度。

    如果您使用ALTER TABLE tbl_name RENAME TO new_tbl_name并且没有其它选项,则MySQL只对与table tbl_name相对应的文件进行重命名。不需要创建一个临时表。(您也可以使用RENAME TABLE语句对表进行重命名。”*

    所以可以看出MySQL在alter时是复制表结构进行的,所以我建议你一个可以节省时间的方案:
    1、create table_new ,并且包含去掉了2个多余字段+新增5字段
    2、insert into table_new select * from table 复制所有的数据到新的表结构里
    3、drop table ; rename table_new to table; 删掉就表,并将新表名字改成原表名

    当然,当大表的alter,我建议你还是放在较少人访问的时候去处理(比如:凌晨的时候)

    转自: http://www.dewen.org/q/3956
  • 相关阅读:
    java定义类 对象,引用,指针
    java数组 数组工具类Arrays
    java 流程执行 循环 foreach循环
    java注释 命名 数据类型 基本类型转换 位运算符 逻辑运算符 三目运算符
    maven 学习1 -安装maven 并执行编译命令
    Lucene工作原理(转)
    nginx&tomcat实现负载均衡
    nginx安装(centos-7下安装nginx-1.8.1)
    spring中bean的作用域
    Spring管理事务配置的五种方式
  • 原文地址:https://www.cnblogs.com/catkins/p/5270599.html
Copyright © 2011-2022 走看看