Mysql 在大表上添加索引需要花费很长时间

Mysql 在大表上添加索引需要花费很长时间,mysql,indexing,Mysql,Indexing,我有一个名为unused的表(在MySQL中),大约有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

我有一个名为
unused
的表(在MySQL中),大约有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万行,但运行这类事情似乎不应该超过一个小时。但也许这很正常。我真的不知道我在做什么。有人能告诉我吗?

这是正常的,取决于您的服务器规格。MySQL创建索引的方式是通过表,然后对索引进行排序和添加。这意味着它需要重新写入所有数据,然后对所有数据进行排序(无论如何都不便宜)。这取决于服务器的I/O性能以及可以提供多少ram

以下是一些参考资料以获取更多信息


如果您给出真实的表格定义,这会有所帮助。我编辑了问题,将其包括在内。同意。我在一个120万行的表中添加了一个索引,花了半个小时,但这取决于硬件。在生产箱(2xquad-core xeon、32gb ram、FC SAN)上,为5亿行表(30gb表大小)在int列上添加索引大约需要20分钟。数据类型、大小、I/O速度、内存大小等太多了,如果不知道所有细节,就不可能说出什么是快什么是慢……我有一个2.4GHz的处理器和4GB的RAM,如果有帮助的话。所以如果我的封套后计算是正确的,你的表的数据大小大约是1gb?如果是这样的话,试着将内存增加到1gb或2gb左右。。。看看这是否有帮助。。。