最有效的方法是为大型mysql表添加索引

时间:2010-09-10 14:41:30

标签: mysql performance indexing

我有一个mysql数据库,其中包含一个超过600万行且没有索引的特定表。诸如SELECT ... FROM log ORDER BY log_date ASC之类的简单查询将花费不可接受的时间。我显然需要在表中添加索引,但我不确定最有效的方法。

1)我的第一个选择是发布ALTER TABLE log ADD INDEX log_date,但我不确定它需要多长时间...它会花费与前一个查询大致相同的时间长度吗?如果是这样,这是不可接受的。

2)我的第二个选择是导出表TRUNCATE表,发出ALTER TABLE语句,然后重新导入表数据。我不确定重新导入数据需要多长时间,并且担心如果系统在此过程中尝试将行写入表中会发生什么。

是否有人能够深入了解在生产系统中索引中等大小的表的最佳方法,而不会造成太多的悲伤?

2 个答案:

答案 0 :(得分:7)

我们的实验表明,在性能方面最好的答案是1 - 创建一个新的空表并将索引添加到该表中,然后将原始表复制到其中。然后将旧表重命名为新名称,为新表指定正确的名称,最后删除旧表。

答案 1 :(得分:3)

据我所知,选项2实际上会让你比选项1更麻烦,不仅因为它涉及更多的数据混乱,而且因为将数据导入表并同时构建索引将是花费的时间不仅仅是导入数据,然后构建整个索引。

考虑一下:如果MySQL正在导入表数据并同时构建索引,那么在插入的每一行中,不仅要插入该行,还要在索引中插入一行。这比仅仅从已经存在的数据构建索引要慢。另一方面,如果您完整地恢复数据然后构建索引,那么您将回到选项1,但在此期间您已经毫无意义地清空并重新填充表格。

我不认为你会获得比通过咬住子弹并发出ALTER TABLE命令更好的性能。也许你可以安排命令在使用率较低的时候运行,比如半夜?