2012-01-18 65 views
0

我想700MB的表從MyISAM數據轉換使用下面的命令InnoDB的:爲什麼從MyISAM轉換到InnoDB需要永久?

ALTER TABLE table_name ENGINE = InnoDB; 

我不知道爲什麼它永遠了(它沒有完成,我殺了等待一個小時後查詢)。我觀察到,我的記憶體使用率攀升至60%,平穩。我懷疑調整一些參數可能有幫助,但我不知道哪一個。

+0

定義「永遠」。你寫得像是花了很長一段時間,但並不是永遠。知道它是否完成,需要多長時間會很有幫助。 – 2012-01-18 10:33:15

+0

@ todda.speot.is:沒有完成。我殺了查詢。 – 2012-01-18 10:34:03

回答

2

因爲它需要基本上創建一個新表,請複製所有數據,創建新索引並刪除舊錶。兩種存儲引擎都有非常不同的將數據存儲在磁盤上的方式,所以轉換並不簡單。

您可以嘗試將錶轉儲到SQL中,編輯轉儲以便創建表語句使用InnoDB而不是MyISAM,然後將其上載回去。我認爲它可能會快一點。

另請注意,您的my.cnf中的InnoDB緩衝池的默認值可能非常低,導致InnoDB無法獲得足夠的內存來有效工作。

+0

我的innodb_buffer_pool_size是134MB。你認爲還有多少是足夠的? – 2012-01-18 10:46:06

+0

對於700MB的桌子?至少1GB;)這裏的一般規則是:越多越好。 – Mchl 2012-01-18 10:48:37

+0

你提供了它需要這麼長時間的原因。這一次我耐心等待,並在1小時25分鐘內完成。不知道是否可以做得更快。 – 2012-01-19 06:32:34

4

在MySQL文檔中有關於轉換到InnoDB的discussion of issues

這裏有一些亮點/報價:

  • 如果你的表有唯一約束,然後關閉獨特的檢查 第一:

    SET unique_checks=0; 
    ALTER TABLE table_name ENGINE = InnoDB;  
    SET unique_checks=1; 
    
  • 「要在插入過程中得到更好的控制, 插入大件表可能很好:「

    INSERT INTO newtable SELECT * FROM oldtable 
    WHERE yourkey > something AND yourkey <= somethingelse; 
    

    插入所有記錄後,可以重命名錶。 「

  • 」在轉換大表期間,您應該增加InnoDB緩衝池的大小以減少磁盤I/O。「

  • 「確保你沒有填滿表空間: 需要比MyISAM表了更多的磁盤空間InnoDB表如果ALTER TABLE 操作運行的空間,它開始回滾,而且可以採取如果是磁盤綁定,則需要小時數 。「

+0

感謝您的參考。我採用了第1點和第3點。但是,700MB桌面和200MB索引仍然花了我1小時25分鐘。不知道這是否可以像我一樣快。 – 2012-01-19 06:34:15

相關問題