2

我有一个最初在 MySQL 3.x 中创建的游戏数据库,并且还有一些 MyISAM 表。

由于不同的原因(这是一个单独讨论的主题),我想将它们迁移到 INNODB。

其中一张表有 1.2 亿行(准确地说是 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 服务器的负载有多大?

PS现在我正在考虑将DB复制到

要转换的表的 PPS 定义:

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';
4

1 回答 1

2

我不喜欢留下未答复的消息,所以我将 Joshua 的建议作为答案发布。

更改表时,MySQL 将使用新属性(或新引擎类型)创建第二个表,将第一个表的所有行复制到第二个表,然后用第二个表替换第一个表。对于大型表,此操作将需要很长时间。

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

于 2013-09-16T00:22:36.863 回答