在大型表上添加索引需要很长时间

20

我有一个MySQL表叫做unused,它大约有540万行。这个表长这样:

CREATE TABLE `unused` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `account_id` bigint(20) DEFAULT NULL,
  `heading_label` varchar(255) NOT NULL,
  `value` varchar(255) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`),
  KEY `fk_account_id` (`account_id`),
  CONSTRAINT `unused_ibfk_1` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=80524905 DEFAULT CHARSET=latin1

我认为如果添加索引,该表上的查询速度可能会更快。我尝试运行了以下代码:

create index heading_label
on unused (heading_label) using btree

在重启MySQL之前,我让这个命令运行了一两个小时。尽管这个表有超过500万行,但似乎不应该花费一个多小时来运行这种操作。但也许这是正常的。我真的不知道我在做什么。有谁能给我指点迷津吗?


1
如果您提供真实的表定义,将会有所帮助。 - Lightness Races in Orbit
我编辑了问题并包含了这个内容。 - Jason Swett
首先,通过查看服务器活动情况确定您是否受到I/O、CPU或内存限制。例如,如果您的CPU使用率一直很低,那么您可能会受到I/O限制,在这种情况下,将您的datadir仅暂时移动到基于RAM的磁盘上(请参见https://learningwell.se/mounting-mysql-in-ram作为参考),以加速索引创建过程。但是,这将需要将您的完整数据库服务离线一段时间。 - Jaime Hablutzel
1个回答

20

1
同意。我给一个有1.2百万行的表添加了一个索引,用了半个小时的时间。 - Mikhail
1
但这取决于硬件。在生产环境中(2xquad core xeon,32gb ram,FC SAN),为一个包含5亿行记录的表格(30gb表格大小)的int列添加索引大约需要20分钟。由于涉及到数据类型、大小、I/O速度、内存大小等众多因素,如果不了解所有细节,很难说什么是快或慢的。 - ircmaxell
我有一颗2.4GHz的处理器和4GB的内存,如果这有帮助的话。 - Jason Swett
如果我的草稿计算正确的话,你的表格数据大小大约是1GB?如果是这样,请尝试将InnoDB缓冲池增加到大约1GB或2GB...看看是否有所帮助... - ircmaxell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接