2014-09-24 64 views
0

有什麼我可以在my.ini文件中加快「LOAD DATA INFILE」的速度?MySQL負載數據INFILE服用13小時

我有兩個MySQL 5.5實例的每一個具有結構化一個相同的表如下:

CREATE TABLE `log_access` (
    `_id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `type_id` int(11) NOT NULL, 
    `building_id` int(11) NOT NULL, 
    `card_id` varchar(15) NOT NULL, 
    `user_key` varchar(35) DEFAULT NULL, 
    `user_name` varchar(25) DEFAULT NULL, 
    `user_validation` varchar(10) DEFAULT NULL, 
    PRIMARY KEY (`_id`), 
    KEY `log_access__user_key_timestamp` (`user_key`,`timestamp`) 
    KEY `log_access__timestamp` (`timestamp`) 
) ENGINE=MyISAM 

在日常基礎上我需要從前一天從實例的移動數據到實例B,它由大約2500萬條記錄。目前,我做了以下內容:

  1. 在實例A,生成具有「WHERE時間戳之間 ‘2014年9月23日00:00:00’的OUTFILE和「2014年9月23日23:59 :。59' 這通常需要小於2分鐘
  2. 在實例B,執行‘LOAD DATA INFILE’這是問題區域 ,因爲它需要13個小時
  3. 在實例A,刪除記錄。這可能會是另一個
  4. 對於實例B,運行狀態在實例B上,截斷表

我也考慮過分區表和交換分區。 EXCHANGE PARTITION在5.6中支持,我願意更新MySQL,但是,所有文檔都討論了表之間的交換,而我還沒有能夠確認我可以在數據庫實例之間做到這一點。

實例之間的複製,但由於我過去沒有複製過,而且這是一項時間敏感的任務,所以我不太願意踏入新的水域。

任何智慧的話都非常感謝。

+0

您是否試圖在LOAD DATA INFILE之前禁用實例B上的密鑰? – VMai 2014-09-24 17:01:38

+0

因此,文件有多大> – 2014-09-24 17:39:07

+0

不,EXCHANGE PARTITION無法將分區從一個實例移動到另一個實例。 – 2014-09-24 17:44:47

回答

0

創建沒有PRIMARY KEY和_id列的表,並在LOAD DATA INFILE完成後添加這些表。 MySQL使用每個INSERT檢查PRIMARY KEY的完整性,所以我認爲你可以在這裏獲得很多性能。隨着MariaDB的,你可以禁用按鍵,但我認爲這不會對某些存儲引擎的工作(見here

不是非常不錯的替代方案: 我發現它很容易移動一個MyISAM數據庫的只是複製/移動磁盤上的文件。如果您剪切/粘貼文件並運行REPAIR TABLE。在目標機器上,您可以在不重新啓動服務器的情況下執行此操作只要確保您複製所有3個文件(.frm,.myd,.myi)

+0

這種解決了問題,因爲我仍然需要創建密鑰,否則統計查詢將永遠。 LOAD DATA INFILE現在只需不到2分鐘,這非常棒。但是,當我嘗試在user_key列上創建索引時,該進程將永遠處於「複製到tmp表」的進程狀態 – Kate 2014-09-24 20:15:03

+0

您是否有足夠的磁盤空間?你檢查my.ini參數(如key_buffer_size和其他,請參閱[這裏](http://stackoverflow.com/questions/1924083/tuning-mysql-for-speedy-column-index-creation-during-development))可以你提供索引創建查詢? – Benvorth 2014-09-25 09:52:09