我正在尋找一種將記錄從MEMORY表移動到MYISAM表的快速方法。 MEMORY表有大約50萬條記錄。兩個表具有完全相同的結構(相同數量的列,數據類型等)。但MYISAM表在幾列上被索引(B-TREE)。大約有25列,其中大部分是無符號整數。從MEMORY表中移動百萬條記錄到MYISAM表
我已經嘗試使用「INSERT INTO SELECT * FROM」查詢。但有沒有更快的方法來做到這一點?
感謝您的幫助。
PRASHANT
我正在尋找一種將記錄從MEMORY表移動到MYISAM表的快速方法。 MEMORY表有大約50萬條記錄。兩個表具有完全相同的結構(相同數量的列,數據類型等)。但MYISAM表在幾列上被索引(B-TREE)。大約有25列,其中大部分是無符號整數。從MEMORY表中移動百萬條記錄到MYISAM表
我已經嘗試使用「INSERT INTO SELECT * FROM」查詢。但有沒有更快的方法來做到這一點?
感謝您的幫助。
PRASHANT
原則,你應該獲得更好的性能:
沒有二級索引創建目標表。
對目標表的主鍵上的源表的內容進行排序。
將已排序的記錄插入到目標表中。
一次添加一個輔助索引。
這可能主要是關於調整。 MyISAM表最初是空的嗎?如果是這樣,你可以做一些祕技 - 在加載期間禁用索引,然後啓用它們(這在非空表上不是個好主意)。
在內存表中執行ORDER BY並不是一個特別好的想法,因爲它們通常使用散列索引,因此不能執行按序索引掃描,因此它會引入額外的filesort(),這可能是不好的。
其他人指出 - 你不應該在插入過程中使用索引。 您可以禁用更新他們在每一次插入:
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
設置。
是,除了在MyISAM中,加入了二次索引重建所有索引和數據文件,所以你真的想一次添加的所有索引。 – MarkR 2010-04-13 14:34:45