2013-04-13 36 views
1

我有一個遊戲數據庫,最初是在MySQL 3.x中創建的,並且仍然有一些MyISAM表。如何從MyISAM轉換爲INNODB的巨大表格?

由於不同的原因(這是一個單獨的討論主題),我想將它們遷移到INNODB。

其中一個表有120萬行(準確地說120 262 514)。我已經執行它的轉換成INNODB ...它是昨天開始,並且仍在繼續...

除了改變引擎我想改變類型的幾個領域雖然。該查詢如下:

ALTER TABLE gb_vfm5.my_table 
    CHANGE COLUMN matchId matchId INT(11) NOT NULL DEFAULT 0, 
    CHANGE COLUMN team team INT(11) NOT NULL DEFAULT 0, 
    CHANGE COLUMN pl1 pl1 INT(11) NOT NULL DEFAULT 0, 
    CHANGE COLUMN actionId actionId TINYINT(2) UNSIGNED NOT NULL DEFAULT 0, 
    CHANGE COLUMN src src TINYINT(2) UNSIGNED NOT NULL DEFAULT 0, 
    CHANGE COLUMN opponent opponent INT(11) NOT NULL DEFAULT 0, ENGINE = INNODB 

問題:

  1. 爲什麼查詢執行需要這麼長時間?可能我應該先改變引擎,然後改變字段?

  2. 做這些改變的最佳方法是什麼?

  3. 這種轉換到MySQL服務器的負載有多大?

P.S.現在我正考慮將數據庫複製到

P.P.S.表的定義轉換:

CREATE TABLE my_moment(
    Id INT(11) NOT NULL AUTO_INCREMENT, 
    matchId INT(10) UNSIGNED NOT NULL DEFAULT 0, 
    mTime TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, 
    team INT(10) UNSIGNED NOT NULL DEFAULT 0, 
    pl1 INT(10) UNSIGNED NOT NULL DEFAULT 0, 
    actionId TINYINT(1) UNSIGNED NOT NULL DEFAULT 0, 
    src TINYINT(1) UNSIGNED NOT NULL DEFAULT 0, 
    pos2 SMALLINT(5) UNSIGNED NOT NULL DEFAULT 0, 
    pl2 INT(11) NOT NULL DEFAULT 0, 
    poss1 SMALLINT(5) UNSIGNED NOT NULL DEFAULT 0, 
    poss2 SMALLINT(5) UNSIGNED NOT NULL DEFAULT 0, 
    mRes TINYINT(4) NOT NULL DEFAULT 0, 
    opponent INT(10) NOT NULL DEFAULT 0, 
    move TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, 
    PRIMARY KEY (Id), 
    INDEX actionId (actionId, pl1, mRes), 
    INDEX matchId (matchId), 
    INDEX NewIndex1 (mRes), 
    INDEX NewIndex3 (actionId, pl2), 
    INDEX pl1 (pl1), 
    INDEX pos2 (pos2), 
    INDEX UK_my_table_MatchTeamAction (matchId, team, actionId) 
) 
ENGINE = MYISAM 
AUTO_INCREMENT = 125433749 
AVG_ROW_LENGTH = 36 
CHARACTER SET cp1251 
COLLATE cp1251_general_ci 
COMMENT = 'My table description'; 
+0

您沒有向我們提供基礎表的表定義。 – fenway

+0

已添加。感謝您將此引起我的注意。 – Budda

+1

當更改表時,MySQL將創建具有新屬性(或新引擎類型)的第二個表,將所有第一個表的行復制到第二個表,然後用第二個表替換第一個表。對於大型桌子來說,這個操作需要很長時間。 – jmkeyes

回答

1

我不喜歡離開無應答消息,所以我張貼約書亞的建議爲答案。

當改變表,MySQL將創建第二個表與新 屬性(或新的發動機類型),所有的第一個表中的行復制到 第二個表,然後用第二 更換表頭一。對於大型桌子來說,這個操作需要很長時間。

所以後面的想法是在我自己的表格中創建,將原始表格中的記錄一塊一塊地移動到新的表格中,然後重新命名錶格。最後一步是重新創建外鍵。