2011-08-18 98 views
0

我有一個最初使用MyISAM設置的模式。我之間有沒有定義爲外鍵的表之間的關係,但我會鏈接表與連接等。顯然沒有級聯刪除/更新等規則...在MySQL中將MyISAM轉換爲InnoDB

我重新創建相同的數據庫模式與InnoDB,但這次我把外鍵放入創建語句並定義了更新/刪除規則。

我使用PHP從CSV文件中將大約200,000條記錄加載到數據庫中。它最初需要幾分鐘時間,但自從我交換到InnoDB後,PHP腳本在10分鐘後超時,只處理了約7%的CSV文件。

我很想回到沒有關係的MyISAM,但是更好的解決方案(如果可能的話)是在初始填充數據庫時使用MyISAM,然後切換回InnoDB並讓MySQL修復關係。我不知道這是否可行,但我認爲如果是這樣,MySQL可以修復它自己的內部數據結構,而不是逐個PHP插入。

需要考慮的另一件事是,大約每年一次,我們需要重新載入一組200,000條記錄並確定哪些記錄發生了變化。當我們需要這樣做時,可能無法從一臺引擎切換到另一臺引擎。

任何指針?

+0

MySQL的版本?另外,直接回答:http://stackoverflow.com/questions/2167522/innodb-takes-over-an-hour-to-import-600mb-file-myisam-in-a-few-minutes/2167641#2167641 –

+0

MySQL Version 5.5.8 – Ozzah

+0

您是否修改innodb變量以獲得更好的性能,還是全部使用默認設置? –

回答

2

如果您對每個插入使用一個插入查詢,那麼將數據插入數據庫可能需要很長時間。

INSERT INTO `table` (field1, field2, field3) 
VALUES 
(value, value, value), 
(value, value, value), 
(value, value, value); 

另外,如果您想將它插入到MyISAM表,無論如何,沒有任何問題之一:當您使用的mysqldump生成的格式,這樣它會顯著加快。只要確保你的外鍵完整性是正確的。插入所有數據後,對所有表執行此操作:

ALTER TABLE `table` ENGINE = innodb; 
+0

哇,我不知道你可以將它們鏈接成一個查詢。 – Ozzah

2

很難說你可能是錯的做什麼,不會在您的代碼盯着,但一對夫婦的事情,你可以嘗試:

  1. 運行SET foreign_key_checks = 0;,然後再開始加載,然後SET foreign_key_checks = 1;大功告成加載後加快插入時間。
  2. 確保您正在事務中運行批量插入,因此您每次都不會自動提交。

看看是否有幫助。