• MySQL之 加快ALTER TABLE的执行速度


    本节内容总结自《High Performance MySQL》

    加快ALTER TABLE的操作速度

    MySQL执行ALTER TABLE的原理
    • MySQL执行大部分修改表结构操作的方法是用一个新的结构创建一个空表,从旧表中查出所有数据插入新表,然后删除旧表,一般而言,大部分ALTER TABLE操作都会锁表,导致MySQL服务中断。
    一些ALTER TABLE的技巧
    1. 先在一台不提供服务的机器上执行ALTER TABLE操作,然后和提供服务的主库进行切换。
    2. 影子拷贝:用要求的表结构创建一张和原表无关的新表,然后通过重命名和删表操作交换两张表。
    一些ALTER TABLE 可以不进行表重建
    1. 例如修改列的默认值。
    2. 移除一个列的AUTO_INCREMENT属性。
    3. 增加,移除,或更改ENUM和SET常量。
      • 不重建表的解决方法:为想要的表结构创建一个新的.frm文件,然后用它替换掉已经存在的那张表的.frm文件,具体步骤如下。①:创建一张有相同结构的空表,并进行需要的修改。②:执行FLUSH TABLES WITH READ LOCK。这将会关闭所有正在使用的表,并且禁止任何表被打开。③:交换.frm文件。④:执行UNLOCK TABLES来释放第2步的锁。
    快速创建MyISAM索引
    1. 高效的创建MyISAM索引:一个常用的技巧是先禁用索引,载入数据,然后重新启用索引。这是因为构建索引的工作被延迟到数据完全载入以后,这个时候已经可以通过排序来构建索引了。这样做会快很多,而且使得索引树的碎片更少,更紧凑。但是这个办法对唯一索引无效,因为DISABLE KEYS只对非唯一索引有效。MyISAM会在内存中构造唯一索引,并且为载入的每一行检查其唯一性。
    2. 可以使用如下类似骇客的方式快速创建索引,具体步骤如下。①:用需要的表结构创建一张表,但是不包括索引。②:载入数据到表中以构建.MYD文件。③:按照需要的结构创建另一张空表,这次要包含索引,这会创建需要的.frm和.MYI文件。④:获取读锁并刷新表。⑤:重命名第二张表的.frm和.MYI文件,让MySQL认为是第一张表的文件。⑥:释放读锁。⑦:使用REPAIR TABLE来重建表的索引。该操作会通过排序来构建所有索引,包括唯一索引。
    时间并不会因为你的迷茫和迟疑而停留,就在你看这篇文章的同时,不知道有多少人在冥思苦想,在为算法废寝忘食,不知道有多少人在狂热地拍着代码,不知道又有多少提交一遍又一遍地刷新着OJ的status页面…… 没有谁生来就是神牛,而千里之行,始于足下!
  • 相关阅读:
    STL map
    HDU1372 Knight Moves BFS
    HDU1072 Nightmare BFS
    discuz论坛发帖添加字段
    gridview自定义button事件 ,无法触发 onrowcommand
    discuz 怎么开启评分!!!
    discuz学习网站收集
    discuz扩展工具集合
    童话世界整理“说说”
    asp.net中Literal与label的区别
  • 原文地址:https://www.cnblogs.com/bianjunting/p/14347476.html
Copyright © 2020-2023  润新知