簡體   English   中英

帶外鍵的MySQL INSERT INTO表速度很慢

[英]MySQL INSERT INTO tables with foreign key speed is very slow

我正在嘗試將約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;

謝謝你的幫助

首先,不需要索引concept_id_1 主鍵完全覆蓋了該索引。

我的建議是創建不包含鍵或外引用(主鍵除外)的表。 當您插入表中時,請確保輸入數據按主鍵的鍵排序。 然后添加其他與顯式索引創建的鍵:

create index concept_relationship_idx1 on concept_relationship(concept_id_1);

等等。

如果此方法無法有效工作,請重新考慮主鍵。 數據實際上是由主鍵排序的,這對於插入操作可能是計算密集型的。 添加一個自動遞增的主鍵。 插入數據。 然后為現在的主鍵創建unique索引,為其他鍵創建索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM