我试图将大约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;
感谢您的帮助
答案 0 :(得分:1)
首先,不需要索引concept_id_1
。主键完全覆盖了这个索引。
我的建议是创建没有密钥或外部引用的表,主键除外。插入表格时,请确保输入数据按主键的键排序。然后使用显式索引创建添加回其他键:
create index concept_relationship_idx1 on concept_relationship(concept_id_1);
等等。
如果这不能有效工作,请重新考虑主键。实际上,数据按主键排序,这对于插入来说可能是计算密集型的。添加自动递增的主键。插入数据。然后为现在的主键创建一个unique
索引,并为其他键创建索引。