Schema的优化和索引 - 加速ALTER TABLE
2009-09-02 00:00:00 来源:WEB开发网你可以不用重建表来做如下类型的操作:
移除列的AUTO_INCREMENT属性。
添加,移除,更改ENUM和SET。如果你移除了一个常量并且一些行包含这个值,查询语句返回这个值将会是空字符串
基本的技术就是创建一个.frm文件并且拷贝它到以存在表的.frm文件的位置。步骤如下:
创建一个空表,当然表布局必须是准确的。除了一些更改的项。
执行FLUSH TABLES WITH READ LOCK.这一步将关闭使用的所有的表并且防止了这些表被打开。
交换.frm文件。
执行UNLOCK TABLES释放读锁。
为了做例子,我们给skila.film表的rating列添加一个常量。当前的列如下:
mysql> SHOW COLUMNS FROM sakila.film LIKE 'rating';
+--------+------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------------------------+------+-----+---------+-------+
| rating | enum('G','PG','PG-13','R','NC-17') | YES | | G | |
+--------+------------------------------------+------+-----+---------+-------+
我们添加一个PG-14到这列中。
mysql> CREATE TABLE sakila.film_new LIKE sakila.film;
mysql> ALTER TABLE sakila.film_new
-> MODIFY COLUMN rating ENUM('G','PG','PG-13','R','NC-17', 'PG-14')
-> DEFAULT 'G';
mysql> FLUSH TABLES WITH READ LOCK;
更多精彩
赞助商链接