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

Mysql 向表中添加或删除列是否会强制重新创建所有索引?,mysql,sql-server,oracle,indexing,Mysql,Sql Server,Oracle,Indexing,特别是MySQL(尽管我认为Oracle和Microsoft SQL Server也是如此)。如果我向表中添加或删除一列,是否需要从头创建(该表上的)所有当前索引 我可以想象,如果我们正在更改表行大小(通过添加/删除列),那么rowid将更改(非聚集表),从而强制重新创建所有索引 如果使用聚集索引(Oracle中的索引组织表),那么我可以想象整个聚集索引也必须重新创建 如果需要重新创建所有索引,是否有优化重建时间的策略?您没有说明MySQL的版本和存储引擎。但我怀疑你的问题的答案就在这一页上:

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

我可以想象,如果我们正在更改表行大小(通过添加/删除列),那么rowid将更改(非聚集表),从而强制重新创建所有索引

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


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

您没有说明MySQL的版本和存储引擎。但我怀疑你的问题的答案就在这一页上:

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

MyISAM: 增加myisam\u sort\u buffer\u size的值

InnoDB: 增加innodb\u缓冲区\u池\u大小
增加innodb日志文件大小

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


来源:我是经过认证的MySQL DBA。

rowid不应更改。您可能会得到不需要的链接效果。在SQL Server中,它只会重新创建引用该列的索引。聚集索引将发生变化,但聚集索引实际上是表,而不仅仅是索引。尽管如此,它仍然会很混乱,因为它会导致页面拆分和指针以及各种恶劣的存储级别问题。因为发布答案太长,您可以参考手册页面查看发生了什么,因为它已经详细描述了。我知道TokuDB MySQL引擎支持不会从头开始重建索引的热模式更改。@NB-除非我遗漏了某些内容,否则您提供的链接无法为我的问题提供清晰的答案。。。虽然它确实建议将myisam\u sort\u buffer\u size系统变量增加到一个高值,以加快索引的创建。对不起,我忘记回复了。在Google上搜索“innodb_buffer_pool_size”会给出很多好的答案,但总体来说,这些答案都是:对于100%innodb的专用MySQL服务器,您可能希望使用至少75%的物理RAM作为innodb缓冲池。不过,首先要确保你的操作系统有足够的内存。