向表中添加或删除列是否会强制重新创建所有索引?

时间:2012-01-13 16:57:36

标签: mysql sql-server oracle indexing

特别是在MySQL中(尽管我认为对于Oracle和Microsoft SQL Server也是如此)。如果我向表添加或删除列,是否需要从头创建所有当前索引(在该表上)?

我想如果我们要更改表行大小(通过添加/删除列),那么ROWIDS将更改(非群集表),从而强制重新创建所有索引。

如果使用聚簇索引(Oracle中的索引组织表),那么我会想象也必须重新创建整个聚簇索引。

如果需要重新创建所有索引,是否有任何优化重建时间的策略?

1 个答案:

答案 0 :(得分:2)

你没有说什么版本的MySQL和哪个存储引擎。但我怀疑你的问题的答案在这个页面上:

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

对您的问题的简短回答是,在添加或删除列时,将重建整个表(所有数据和所有索引)。要提高速度,请尝试以下操作:

的MyISAM: 增加myisam_sort_buffer_size的值

InnoDB的: 增加innodb_buffer_pool_size
增加innodb_log_file_size

任一存储引擎: 使用列可能的最小列数据类型。

来源:我是MySQL DBA认证。