具有外键速度的MySQL INSERT INTO表非常慢

时间:2014-02-07 03:42:32

标签: mysql grails insert

我试图将大约1000万条记录(从postgres通过grails)插入到包含主键和2个外键的表中。如果我保留所有主键和外键以及自动生成的索引以及这些键,则需要大约7.5小时才能完成。如果我在插入之前删除所有键和索引,则只需10分钟即可执行所有插入操作。但是当我使用ALTER TABLE重新添加密钥时,需要花费很长时间(超过7个小时)来执行。有没有办法改善表现?

此表链接的概念表有大约100万条记录。

这里是CREATE TABLE语句:

CREATE TABLE `concept_relationship` (
  `concept_id_1` int(11) NOT NULL,
  `concept_id_2` int(11) NOT NULL,
  `relationship_id` int(11) NOT NULL,
  `valid_start_date` date NOT NULL,
  `valid_end_date` date NOT NULL DEFAULT '2099-12-31',
  `invalid_reason` char(1) DEFAULT NULL,
  PRIMARY KEY (`concept_id_1`,`concept_id_2`,`relationship_id`),
  KEY `concept_id_1` (`concept_id_1`),
  KEY `concept_id_2` (`concept_id_2`),
  KEY `relationship_id` (`relationship_id`),
  CONSTRAINT `FK_CONCEPT_REL_child` FOREIGN KEY (`concept_id_2`) REFERENCES `concept` (`concept_id`),
  CONSTRAINT `FK_CONCEPT_REL_Parent` FOREIGN KEY (`concept_id_1`) REFERENCES `concept` (`concept_id`),
  CONSTRAINT `FK_CONCEPT_REL_REL_TYPE` FOREIGN KEY (`relationship_id`) REFERENCES `relationship` (`relationship_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

首先,不需要索引concept_id_1。主键完全覆盖了这个索引。

我的建议是创建没有密钥或外部引用的表,主键除外。插入表格时,请确保输入数据按主键的键排序。然后使用显式索引创建添加回其他键:

create index concept_relationship_idx1 on concept_relationship(concept_id_1);

等等。

如果这不能有效工作,请重新考虑主键。实际上,数据按主键排序,这对于插入来说可能是计算密集型的。添加自动递增的主键。插入数据。然后为现在的主键创建一个unique索引,并为其他键创建索引。