2017-05-28 88 views
0

我看到到處程序員discuting的最快LOAD DATA INFILE插入優化。但他們從來沒有解釋過很多他們的價值選擇等,優化取決於環境和實際的實際需求。MySQL的優化LOAD DATA INFILE

所以,想上什麼是在達到最快的插入可能我的MySQL配置文件的最佳值的一些解釋相關,請。

我的配置,英特爾雙核@ 3.30 GHz的,4GB DDR4 RAM(Windows7的說: 「2.16Gb可用」 壽由於保留內存)。

我backup.csv文件明文約5億的條目,所以它的一個巨大的500GB文件大小這樣舍姆(但十六進制字符串,長度64):

"sdlfkjdlfkjslfjsdlfkjslrtrtykdjf";"dlksfjdrtyrylkfjlskjfssdlkfjslsdkjf" 

在我的表,唯一的兩個字段第一個是Unique索引。 行格式設置爲固定節省空間的問題。出於同樣的原因,字段類型被設置爲BINARY(32)。

即時通訊使用MyISAM引擎。 (!因爲InnoDB需要更多的空間)(MySQL版本5.1.41)

這裏是我計劃用現在的代碼:

ALTER TABLE verification DISABLE KEYS; 
LOCK TABLES verification WRITE; 
LOAD DATA INFILE 'G:\\backup.csv' 
     IGNORE INTO TABLE verification 
     FIELDS TERMINATED BY ';' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' 
     (@myhash, @myverif) SET hash = UNHEX(@myhash), verif = UNHEX(@myverif); 
UNLOCK TABLES; 
ALTER TABLE verification ENABLE KEYS; 

正如你所看到的,命令使用LOAD DATA INFILE採用純文本值,並將其轉化爲HEX(均爲十六進制哈希finaly所以......)

我聽說緩衝區大小等,並從MySQL配置文件中的所有這些值。我應該改變什麼,請問最好的價值是什麼?正如你所看到的,我鎖定了桌子,並且還禁用了鍵以加快速度。

我也閱讀文檔:

myisamchk --keys-used=0 -rq /var/lib/mysql/dbName/tblName 

在這之前插入會加速它也。但是什麼是真的tblName? (?因爲我有一個.frm文件,一個.MYD和.MYI,所以我應該指向哪一個)

Here are the lasts short hints i did read about optimisation

編輯:忘了告訴,一切都爲localhost。

回答

0

因此,我finfinge設法插入我的500GB數據庫超過30億條,在5小時的東西。

我已經嘗試了很多方法,並在重建Primary Index時,我被卡住了這個錯誤ERROR 1034 (HY000): Duplicate key 1 for record at 2229897540 against new record at 533925080

我現在解釋我如何實現來完成我的插入:

  • 我整理我的.csv文件,GNU CoreUtils : sort.exe(在Windows IM)記住這樣做,你需要1.5倍的CSV文件的可用空間,用於臨時文件。 (因此計數.csv文件,最終爲2.5x)
  • 您可以使用索引和全部創建表。
  • 執行mysqladmin flush-tables -u a_db_user -p
  • 執行myisamchk --keys-used=0 -rq /var/lib/mysql/dbName/tblName
  • 插入數據:(請勿使用ALTER TABLE tblname DISABLE KEYS; !!!)

    LOCK TABLES verification WRITE; 
    LOAD DATA INFILE 'G:\\backup.csv' 
        IGNORE INTO TABLE verification 
        FIELDS TERMINATED BY ';' 
        ENCLOSED BY '"' 
        LINES TERMINATED BY '\r\n' 
        (@myhash, @myverif) SET hash = UNHEX(@myhash), verif = UNHEX(@myverif); 
    UNLOCK TABLES;
  • 插入數據時,你重建索引,通過執行myisamchk --key_buffer_size=1024M --sort_buffer_size=1024M -rqq /var/lib/mysql/dbName/tblName (注-rqq,加倍q將通過嘗試修復它們而忽略可能的重複錯誤(而不是在幾個小時的等待之後停止插入!)

  • 執行mysqladmin flush-tables -u a_db_user -p

,我是完成了!

  • 我注意到,在速度的巨大推動作用,如果.csv文件是另一個驅動器比對數據庫,並同樣在另一個驅動器的sort操作,把臨時文件。 (讀/寫速度在同一個地方不能同時DATAS)的這個

源又在這裏:Credits here to this solution

1

我敢肯定它是驗證,而不是verification.MYD或其他兩個。 .MYD是數據,.MYI是索引,.frm是模式。

字符串有多長?是十六進制?如果是32位的十六進制數字,那麼的輸出是不是需要BINARY(16)

過程的長的部分可能會ENABLE KEYS,是時候將建立索引時。在運行時執行SHOW PROCESSLIST; - 如果它顯示「使用keybuffer」,則殺死它,這將持續一段時間。如果有人說「修理修復」,那麼它很好 - 它正在排序,然後有效地加載索引。

在開始進程之前,您可以通過設置myisam_data_pointer_size=5來節省5GB的磁盤空間。似乎也有myisam_index_pointer_size,但它可能默認爲5,這對您的情況可能是正確的。 (我在第4版中遇到過這樣的設置。大約在2004年0;但從來沒有。)

我不認爲key_buffer_size將負載和索引期間 - 因爲你真的不希望它使用key_buffer。不要將它設置得太高以至於RAM耗盡。交換是糟糕的表現。

+0

我絕對沒有所謂的文件'verification',我將嘗試也無妨,可能myisamchk的' '一個人在做這項工作。數據是十六進制字符串是的,長度爲64(所以BINARY(32);我忘了在我的問題上提到這一點)。我的版本是'mysql.exe Ver 14.14 Distrib 5.1.41,對於Win32(ia32)' – user3916429

+0

哦,對於'myisam_data_pointer_size',默認爲'6',所以它的好處,因爲'5'只有五十億。有一個500Gb數據庫,我不會爭取5Gb的誠實=),似乎我沒有'myisam_index_pointer_size'註冊。 – user3916429

+1

你可能有3個文件'verification.MYD'等。大約64/32。 5.1變得古色古香;考慮儘快升級。 「6」(默認值,256TB限制)和「5」(1TB限制)是文件中「數據指針」中_bytes_的數量。 '4'(4GB限制)會太小。 –