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

在MySQL中使用ALTERTABLE构建索引需要多长时间?,mysql,indexing,Mysql,Indexing,这可能有点像询问字符串的长度,但统计信息如下: 英特尔双核4GB内存 表中有800万行,约20列,主要是具有自动递增主id的varchar 查询为:ALTERTABLE my_TABLE ADD INDEXmy_INDEX(my_列) 我的_列是varchar(200) 存储是MyISAM 数量级,应该是1分钟,10分钟,100分钟吗 谢谢 编辑:好的,它花了2小时37分钟,相比之下,在一台规格较小的机器上花了0小时33分钟,设置基本相同。我不知道为什么要花这么长时间。唯一的可能性是prod

这可能有点像询问字符串的长度,但统计信息如下:

  • 英特尔双核4GB内存
  • 表中有800万行,约20列,主要是具有自动递增主id的varchar
  • 查询为:ALTERTABLE my_TABLE ADD INDEX
    my_INDEX
    (my_列)
  • 我的_列是varchar(200)
  • 存储是MyISAM
数量级,应该是1分钟,10分钟,100分钟吗

谢谢


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

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

包含800万行的200个varchar最多需要1.6GB,但由于所有的索引开销,大约需要2-3GB。但如果大多数行少于200个字符,则所需的时间将更少。(您可能需要选择
求和(长度(my_列))
以查看需要多少空间。)

您想编辑您的
/etc/mysql/my.cnf
文件。玩这些设置

myisam_sort_buffer_size = 100M
sort_buffer_size = 100M

祝你好运

此外,如果您需要构建多个索引,最好在一次调用中创建所有索引,而不是单独创建。。。原因:它基本上是重写所有的索引页面,以包含你的新索引和其他任何索引。我在过去的2+gig表中发现了这一点,需要在其上构建大约15个索引。在每个索引之间,构建所有单个索引的时间保持增量增长。然后,一次尝试全部索引的次数略多于3个单独的索引,因为它一次构建了每条记录的全部内容,并编写了全部内容,而不必继续重建页面。

在我的测试
MusicBrainz
数据库中,table
track
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
记录

这台机器是英特尔(R)Core(TM)2 CPU 6400@2.13GHz
,带有2Gb RAM,
Fedora Core 12
MySQL 5.1.42


@@myisam\u排序\u缓冲区大小
256M

在测试环境中需要多长时间?服务器负载可能是您唯一无法解释的事情,但我看不出它需要超过一分钟。我现在正在开发环境中运行。我原以为大约5分钟。30分钟后什么也没做。此外,在顶部,mysqld看起来非常不活跃,而在dev中,如果磁盘空间不足,我会看到60%以上的cpuCheck,特别是在mysql临时目录中。您好,谢谢。我以前用了大约4mm的行完成了这项工作,它完成得非常快,所以是的,用8mm可能我已经将索引推到了磁盘上。嗯,我似乎没有在my.cnf中指定myisam_sort_buffer_大小或sort_buffer_大小……好的,所以它是在我的测试环境中完成的,它在33分钟内具有较低的规格(3gb,更慢的cpu)。Prod仍在运转。我希望有一个状态更新之类的…@Richard:如果没有指定,那么它有默认值(
8M
)。您可以通过发出
SELECT@@myisam\u sort\u buffer\u size
来检查它。这个值太低了,您应该增加它(特别是如果您有
3 Gb的
RAM
)。此内存仅在创建或修复索引时使用(和分配),因此可以增加它<代码>@@sort\u buffer\u size
不影响索引创建速度,它只影响查询。