2012-09-28 26 views
0

我正在構建一張將用於READ ONLY的表,這就是爲什麼我決定使用MyISAM而不是InnoDB(但我願意接受建議)的原因。但是,這個表格需要非常大。雖然每行大約12到14個字節,但表本身將包含數億到數十億行。MyISAM索引使用LOAD DATA INFILE減慢

表看起來是這樣的:

CREATE TABLE `tb1` (`wid` int(11) NOT NULL DEFAULT '0', 
`pid` int(11) NOT NULL DEFAULT '0', 
`hit` tinyint(3) unsigned NOT NULL DEFAULT '0', 
KEY `wid` (`wid`,`hit`,`pid`)) 
ENGINE=MyISAM DEFAULT CHARSET=latin1 

我加載在塊使用LOAD DATA LOCAL INFILE文本文件中的所有數據。

我需要30秒來加載大約20M行。然後我加載一個有100M行的塊,10分鐘後,取消查詢後,總共只有38M行。 (在10分鐘內18M行?)

看來這種類型的加載是指數而不是線性的。這是爲什麼?

當我有一個不斷增加的索引時,我該如何加速LOAD DATA INFILE?

在LOAD DATA INFILE速度方面,使用InnoDB代替MyISAM有沒有好處?

會不會是快沒有索引加載所有數據..然後事後申請一個?

感謝您的輸入。

回答

1

只要運行:

ALTER TABLE `name` DISABLE KEYS; 

... do your query ... 

ALTER TABLE `name` ENABLE KEYS; 

是的每次插入也需要插入到相關表中的每個索引。因此索引速度較慢。

另請注意,您可以在MyISAM上使用INSERT DELAYED

1

減速是索引。您可以使用禁用鍵的把戲,這將導入數據更快,但能鍵步驟仍需要很長的時間。當你導入數據時,你真正想要做的是最大化你的myisam_sort_buffer_size。您可以分配的內存越多,MySQL需要進入磁盤進行排序和更新索引的次數就越少。您仍然可以使用禁用鍵技巧,並且可以在導入完成後降低該值。

加快改變myisam_sort_buffer_size值可能會很快。對我而言,我看到進口需要數小時,降至20分鐘左右。