2010-04-13 66 views
5

我正在尋找一種將記錄從MEMORY表移動到MYISAM表的快速方法。 MEMORY表有大約50萬條記錄。兩個表具有完全相同的結構(相同數量的列,數據類型等)。但MYISAM表在幾列上被索引(B-TREE)。大約有25列,其中大部分是無符號整數。從MEMORY表中移動百萬條記錄到MYISAM表

我已經嘗試使用「INSERT INTO SELECT * FROM」查詢。但有沒有更快的方法來做到這一點?

感謝您的幫助。

PRASHANT

回答

0

原則,你應該獲得更好的性能:

  1. 沒有二級索引創建目標表。

  2. 對目標表的主鍵上的源表的內容進行排序。

  3. 將已排序的記錄插入到目標表中。

  4. 一次添加一個輔助索引。

+0

是,除了在MyISAM中,加入了二次索引重建所有索引和數據文件,所以你真的想一次添加的所有索引。 – MarkR 2010-04-13 14:34:45

0

這可能主要是關於調整。 MyISAM表最初是空的嗎?如果是這樣,你可以做一些祕技 - 在加載期間禁用索引,然後啓用它們(這在非空表上不是個好主意)。

在內存表中執行ORDER BY並不是一個特別好的想法,因爲它們通常使用散列索引,因此不能執行按序索引掃描,因此它會引入額外的filesort(),這可能是不好的。

1

其他人指出 - 你不應該在插入過程中使用索引。 您可以禁用更新他們在每一次插入:

ALTER TABLE table DISABLE KEYS; 
INSERT INTO table 
ALTER TABLE tbl_name ENABLE KEYS; 

而且還鎖定表來獲得單一指標寫入:

LOCK TABLES table WRITE; 
INSERT INTO table 
UNLOCK TABLES; 

無論如何,如果你用它在一個單一的INSERT ... SELECT你可能 得不到顯着的性能增益。

您也可以在服務器配置中調整bulk_insert_buffer_size設置。

更多:http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html