加快ALTER TABLE 操做速度

mysql的alter table操做的性能對於大表來講是個大問題。mysql大部分修改表結構操做的方法都是用新的結構建立一個
新表,從舊錶中查出數據插入新表,而後在刪除舊錶。這樣的操做很耗費時間,並且還有可能中斷mysql服務。
這裏推薦一種方法來提升alter table的操做速度。( 請注意數據備份


修改數據表的.frm文件,步驟以下:
一、建立一個有相同結構的新表,並進行所需修改(例如增長ENUM常量值)。
二、執行FLUSH TABLES WITH READ LOCK.加鎖禁止打開全部表。
三、交換新表和舊錶的.frm文件。
四、執行UNLOCK TABLES解鎖。

語句實例:修改列user_statusmysql

mysql> desc users;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| user_id     | int(11) unsigned    | NO   | PRI | NULL    | auto_increment |
| user_name   | char(125)           | NO   |     | NULL    |                |
| user_pass   | char(32)            | NO   |     | NULL    |                |
| user_status | enum('0','1')       | NO   |     | NULL    |                |
| user_type   | tinyint(2) unsigned | NO   | MUL | 0       |                |
+-------------+---------------------+------+-----+---------+----------------+
mysql>create table users_tmp like users;
mysql>alter table users_tmp modify column user_status enum ('0','1','2') default '2';
mysql>desc users_tmp;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| user_id     | int(11) unsigned    | NO   | PRI | NULL    | auto_increment |
| user_name   | char(125)           | NO   |     | NULL    |                |
| user_pass   | char(32)            | NO   |     | NULL    |                |
| user_status | enum('0','1','2')   | YES  |     | 2       |                |
| user_type   | tinyint(2) unsigned | NO   | MUL | 0       |                |
+-------------+---------------------+------+-----+---------+----------------+
mysql>flush tables with read lock;
#-----------------------------------
這裏是shell命令
進入mysql的datadir目錄交換.frm文件
[root@localhost /var/lib/mysql/test/] cp -a users.frm users.frm.backup
[root@localhost /var/lib/mysql/test/] mv users_tmp.frm users.frm #這個會直接刪除刪除新建的表user_tmp
#-----------------------------------
mysql>unlock tables;
mysql>desc users;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| user_id     | int(11) unsigned    | NO   | PRI | NULL    | auto_increment |
| user_name   | char(125)           | NO   |     | NULL    |                |
| user_pass   | char(32)            | NO   |     | NULL    |                |
| user_status | enum('0','1','2')   | YES  |     | 2       |                |
| user_type   | tinyint(2) unsigned | NO   | MUL | 0       |                |
+-------------+---------------------+------+-----+---------+----------------+
相關文章
相關標籤/搜索