如何更快地创建索引?

5

我在MySQL的表中有1000万行数据和7个索引。现在,当我尝试添加第8个索引时,它需要无限长的时间来完成。是否有任何方法可以解决这个问题,以便轻松快速地添加第8个索引?


不应该是无限的。请提供您的表模式和索引的详细信息。 - Marcus Adams
如果它确实需要“永远”时间,请检查是否在某个地方耗尽了磁盘空间 - 创建索引可能需要大量的临时空间。 - nos
MySQL存在一种小错误,即每个下一个索引所需的时间都会更长。我有400 MB真实内存和1.6 MB交换内存,在创建索引时它们根本没有被使用,而且我还有约20 GB的空间。 - Tom Smykowski
3个回答

5
不,创建索引所需的时间与数据量成正比。在MS SQL中,我可以在大约10分钟内为一个包含许多记录的表创建索引。
编辑:看到评论后,请详细说明无限。按照定义,您是在说它永远不会完成,我的答案与长时间运行的索引创建相关,而不是无限的情况。

那么你已经是最好的了。索引是一项非常密集的任务,特别是在有大量记录的情况下。 - Dustin Laine

2

是的,这就是我所说的东西。 - Tom Smykowski
当我看到执行ALTER TABLE来更改列的默认值或可空性时,复制整个表并重新创建所有索引的操作时,我感到震惊。在其他DMBS上,这些事情需要很少的时间;对于大型表在MySQL上推荐的方法是通过操纵文件系统 - 使用空数据文件更改表定义,然后将完整的数据文件放回原处。 - Marco Mariani
1
这篇文章的作者完全是错的。MySQL在许多情况下确实会在执行ALTER TABLE时重建表,但它永远不会在每个ALTER语句中重建表超过一次;此外,如果需要,您可以通过单个ALTER进行任意数量的修改。 - MarkR
很好知道。事实上,我尽可能地将我的ALTER语句分组。但是,删除索引可能需要几个GB和数小时的时间,这并不美观。 - Marco Mariani

1
你使用的是哪个引擎? ALTER TABLE ...CREATE INDEX的实现方式有很大的差异。
使用MyISAM时,任何索引更改都需要完全重建表。这不是引擎固有的问题,而是一个从未修复的错误。
在使用InnoDB时,创建次要索引不需要重建表,但此优化仅适用于使用InnoDB插件(而不是旧版附带的引擎)的情况下。更改主键始终需要重建,因为它是聚簇的。
无论在哪种情况下重建表格都需要大量的工作,因为它必须重建所有现有的索引,以及重写行,以完成操作。如果您的表格适合RAM(10M行听起来应该很容易),这是相对较快的。
重建不适合RAM的表格相当昂贵,如果可能的话我建议避免它。
重建不适合RAM的单个索引非常昂贵,最好避免它。
你需要多经常添加新索引?也许你可以使用已创建的索引填充表格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接