我有超過700萬行的這張表,而我的LOAD DATA LOCAL INFILE
每次有50萬行數量的更多數據。前幾次是快速的,但是這除了正在越來越長,可能是由於索引開銷:如何提高大型InnoDB表上的LOAD DATA性能?
CREATE TABLE `orthograph_ests` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`digest` char(32) NOT NULL,
`taxid` int(10) unsigned NOT NULL,
`date` int(10) unsigned DEFAULT NULL,
`header` varchar(255) NOT NULL,
`sequence` mediumblob,
PRIMARY KEY (`id`),
UNIQUE KEY `digest` (`digest`),
KEY `taxid` (`taxid`),
KEY `header` (`header`)
) ENGINE=InnoDB AUTO_INCREMENT=12134266 DEFAULT CHARSET=latin1
我開發,將在預先存在的數據庫上運行的應用程序。我很可能無法控制服務器變量,除非我強制要求對其進行更改(我不希望這樣做),所以我很害怕像these這樣的建議的用處有限。
我讀過,最小化這個表上的鍵將有所幫助。但是,我需要這些密鑰以供稍後查詢。我猜如果我放棄並重新創建它們也需要很長時間,但我沒有測試過這個。我也讀過,特別是UNIQUE
約束使插入緩慢。 digest
列將採取SHA256摘要必須是唯一的,我不能確定沒有碰撞(很可能,我知道,但可能)。
分區幫助,建議here?我可以通過限制digest
列上的密鑰長度來改進索引嗎?我應該更改爲MyISAM,它在transcactions期間支持DISABLE KEYS
?我還有什麼可以提高LOAD DATA
的性能?
編輯:
大插入後,此表僅用於SELECT
S,沒有更多的寫入。這種大型加載大多是一次性完成的操作,但是在完成之前需要上傳大約1,000個數據集(每個0.5M行)。
我將使用摘要來查找行,這就是爲什麼我索引該列。如果發生碰撞,則不應上傳該行。
把sequence
BLOB在外部文件系統可能不是一個可行的選擇,因爲我不能輕易地強加給用戶的文件系統的變化。
「非常不可能的,我知道,但有可能」這更可能是您的服務器隨機存儲器位翻轉。您不需要計劃SHA-256衝突。 – usr
請澄清一些事情:該表格是作爲參考表格使用的,還是您將進行生產交易來改變它?你會定期加載一半的新數據嗎?或者這是加載一次完成的操作?你的摘要欄的目的是什麼 - 你會使用摘要來查找生產中的行嗎?如果您的摘要確實遇到了散列衝突,那麼您的恢復計劃是什麼?你有沒有考慮過把你的序列列(你的斑點)放在外部文件系統中? –
@OllieJones:感謝您的評論。編輯了這個問題。 – mpe