MySQL修改表结构的过程

经常用ALTER来修改MySQL的表结构吧?如果这个表很大的话,修改起来很慢是吧?
然后如果用navicat做表结构同步的话,基本每个字段、每个索引的不同都会生成一条ALTER语句,如果你这个时候直接execute all queries,并且刚好你的表里的数据小大,并且你没用上SSD的话,估计你等待ALTER的时间可以吃个饭看场电影了……

这是因为愚蠢的人类没有了解ALTER背后发生了什么事情……

ALTER实际上是这样的。先把a表复制成一个临时表tmp…然后这个时候对a表的select是没问题的,但是update啊或是新的alter啊就会被hold住…然后这个时候服务器会根据ALTER语句去修改临时表的结构……然后现在tmp表是新的结构了……然后服务器再把tmp表更名为a。然后整个ALTER才算结束。然后现在刚刚被hold住的update啊,alter啊就会继续执行。

懂了么,所以如果你有一个300w记录的a表,然后你需要修改a表的10个字段啥的,千万不要写10个alter! 因为在这个过程中,a表要被反复反复地复制成临时表,都是磁盘IO啊……那个慢啊……
聪明一点儿的写法,是把a表的ALTER的10个字段全部写到一个ALTER语句中。比如 ALTER table_a add column xxxxx, add column xxxxxx 。这样就只要复制一次临时表,舒服一些。

Copyright © 2014. All Rights Reserved.

发表评论

电子邮件地址不会被公开。 必填项已用*标注