在大表上添加索引需要永远

Jas*_*ett 15 mysql indexing

我有一个表(在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
Run Code Online (Sandbox Code Playgroud)

如果我要添加索引,我认为这个表上的查询可能会更快.我试过这个:

create index heading_label
on unused (heading_label) using btree
Run Code Online (Sandbox Code Playgroud)

我让这个命令在重启MySQL之前运行了一两个小时.虽然这个表有超过500万行,但似乎不需要花费一个多小时才能运行这类东西.但也许这是正常的.我真的不知道自己在做什么.有人可以开导我吗?

irc*_*ell 16

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

以下是一些资源以获取更多信息......