2013-04-13 41 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将创建第二个表与新 属性(或新的发动机类型),所有的第一个表中的行复制到 第二个表,然后用第二 更换表头一。对于大型桌子来说,这个操作需要很长时间。

所以后面的想法是在我自己的表格中创建,将原始表格中的记录一块一块地移动到新的表格中,然后重新命名表格。最后一步是重新创建外键。