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相對應的文件進行重命名。不需要創建一個臨時表。
也就是說我們在執行alter table操作時,會阻塞所有的dml操作,但可以進行select查詢,這個和oracle有很大的不同。
mysql> select count(*) from test;
+----------+
| count(*) |
+----------+
| 2097152 |
+----------+
1 row in set (2.11 sec)
mysql> alter table test add c varchar(100);
Query OK, 2097152 rows affected (1 min 24.02 sec) --用了85s秒左右
Records: 2097152 Duplicates: 0 Warnings: 0
mysql> alter table test modify c int;
Query OK, 2097152 rows affected (1 min 21.69 sec) --用了85s秒左右
Records: 2097152 Duplicates: 0 Warnings: 0
mysql> alter table test rename to test_new; --這個操作是直接文件名的,所以很快
Query OK, 0 rows affected (0.03 sec)
原文轉自:http://blogread.cn/it/article/72