2010-05-24 61 views
5

我在MySQL的表中有10mln行,在这个表上有7个索引。现在,当我尝试添加8时,需要无限的时间才能完成此操作。有没有什么办法可以解决这个问题,以便轻松快速地添加第8个索引?如何快速创建索引?

+0

它不应该是无限的。请提供您的表格架构和索引的详细信息。 – 2010-05-24 21:12:56

+0

如果确实需要“永久”,请检查您的磁盘空间是否用完 - 创建索引可能需要大量的临时空间。 – nos 2010-05-24 21:27:39

+0

这是每个下一个索引需要更多时间的MySQL的有点bug。我有400 MB的真实和1,6 MB的交换内存,创建索引时根本没有使用,而且我有20 GB的空间 – 2010-05-24 21:39:03

回答

2

这是MySQL刚刚吸引的千种方法之一。按照设计...

详情:http://lists.mysql.com/mysql/202489

,如果我失去了人缘这个答案,我不关心。

+0

是的,这是我想说的 – 2010-05-24 21:40:57

+0

当我看到执行ALTER TABLE来更改列的默认值(或可为空)时,我感到震惊是通过复制整个表并重新创建所有索引来执行的。这些事情在其他DMBS上花费的时间很少;推荐在MySQL上为大表执行的方式是使用文件系统 - 用空数据文件更改表定义并将完整的数据文件放回原位。 – 2010-05-24 21:49:35

+1

本文的发布者完全错误。在很多情况下,当您执行ALTER TABLE时,MySQL会重建表,但它绝不会在每个ALTER语句中多次重建表;此外,如果需要,您可以使用单个ALTER进行任意数量的修改。 – MarkR 2010-05-24 22:24:13

5

不,创建索引所需的时间与您拥有的数据量成正比。在MS SQL中,我在大约10分钟的时间内在一个包含很多记录的表上创建索引。

编辑:看到评论后,请详细说明无限。根据定义,你说它永远不会结束,我的答案与长期运行的索引创建有关,而不是无限的。

+0

是的,花了15分钟 – 2010-05-24 21:40:41

+0

然后你是一样好随着它的到来。索引是一项非常密集的任务,特别是有很多记录。 – 2010-05-24 21:54:08

0

您正在使用哪种引擎? ALTER TABLE ... CREATE INDEX的实现变化很大。

使用MyISAM,任何索引更改都需要完整的表重建。这不是固有的引擎,而是一个从未被修复的错误。

使用InnoDB,创建二级索引不需要重建表,但只有在使用InnoDB插件(而不是旧的,已发货的引擎)时才能使用此优化。更改主键总是需要重建,因为它是聚集的。

重建表格(无论是哪种情况)都需要很多工作,因为它必须重建所有现有索引以及重写行以完成操作。如果你的桌子适合RAM(10M行听起来应该很容易),这是相当快的。

重建一个不适合ram的桌子相当昂贵,我建议尽可能避免它。

重建不适合ram的个别索引非常昂贵,最好避免。

您需要多长时间添加新的索引?也许你可以使用已经创建的索引填充表格?