在MySQL中使用ALTER TABLE构建索引需要多长时间?

时间:2010-02-15 17:41:32

标签: mysql indexing

这可能有点像询问字符串的长度是多长,但统计数据是:

  • 英特尔双核4GB内存
  • 包含8百万行,约20列的表,主要是具有auto_increment主ID的varchars
  • 查询是:ALTER TABLE my_table ADD INDEX my_index(my_column);
  • my_column是varchar(200)
  • 存储是MyISAM

数量级,应该是1分钟,10分钟,100分钟吗?

由于

编辑:确定花了2小时37分钟,相比之下,规格较小的机器上的0小时33分钟,基本相同的设置。我不知道为什么花了这么长时间。唯一的可能性是prod机器HD满85%,100GB免费。应该足够了,但我想这取决于如何分配自由空间。

3 个答案:

答案 0 :(得分:6)

如果您只是添加单个索引,则大约需要10分钟。但是,如果您的内存中没有该索引文件,则需要100分钟或更长时间。

你的800 varchar有800万行最多需要1.6GB,但是所有的索引开销大约需要2-3 GB。但如果大多数行少于200个字符,则需要更少的时间。 (您可能希望选择sum(length(my_column))以查看需要多少空间。)

您想要编辑/etc/mysql/my.cnf文件。使用这些设置进行播放;

myisam_sort_buffer_size = 100M
sort_buffer_size = 100M
祝你好运。

答案 1 :(得分:1)

此外,如果您需要构建多个索引,最好在一次调用中创建所有索引而不是单独...原因:它基本上重写所有索引页面以包含您的新索引与其他任何其他它有过。我在过去发现这个有2+演出表,需要在其上构建大约15个索引。建立所有单独保持在每个指数之间的时间逐渐增长。然后尝试一次只是大约3个单独的索引,因为它构建了所有记录并立即写入所有索引而不必继续重建页面。

答案 2 :(得分:1)

在我的测试MusicBrainz数据库中,表trackPRIMARY KEY分钟内构建25和三个辅助索引:

CREATE TABLE `track` (
  `id` int(11) NOT NULL,
  `artist` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `gid` char(36) NOT NULL,
  `length` int(11) DEFAULT '0',
  `year` int(11) DEFAULT '0',
  `modpending` int(11) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `gid` (`gid`),
  KEY `artist` (`artist`),
  KEY `name` (`name`)
) DEFAULT CHARSET=utf8

该表格有9001870条记录。

机器为Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz 2Gb RAMFedora Core 12MySQL 5.1.42

@@myisam_sort_buffer_size256M