如何更快地创建索引?

时间:2010-05-24 21:10:47

标签: php mysql performance optimization

我在MySQL的表中有10mln行,在这个表上有7个索引。现在,当我尝试添加第8个时,这需要无限的时间。有没有办法解决这个问题,以便轻松快速地添加第8个索引?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

这是MySQL糟透了的千种方式之一。按设计......

详细信息:http://lists.mysql.com/mysql/202489

我不在乎我是否因为这个答案而失去业力。

答案 2 :(得分:0)

您使用的是哪种引擎? ALTER TABLE ... CREATE INDEX的实现差别很大。

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

使用InnoDB,创建辅助索引不需要表重建,但只有在使用InnoDB插件(而不是旧的发运引擎)时才能使用此优化。更改主键始终需要重建,因为它是群集的。

重建表(在任何一种情况下)都需要大量工作,因为它必须重建所有现有索引,以及重写行,以便完成操作。如果你的表适合RAM(10M行听起来应该很容易),这相对较快。

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

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

您需要多久添加一次新索引?也许您可以使用已创建的索引填充表格?