我有一个最初在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
问题:
为什么查询执行需要这么长时间?可能我应该先改变引擎,然后更改字段?
进行此类更改的最佳/正确方法是什么?
这种转换到MySQL服务器的负载有多大?
P.S。现在我正在考虑将DB复制到
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 :(得分:2)
我不想留下未回答的消息,所以我将Joshua的建议作为答案发布。
当更改表时,MySQL将使用new创建第二个表 属性(或新引擎类型),将所有第一个表的行复制到 第二个表,然后用第二个表替换第一个表 一。对于大型表,此操作将花费很长时间。
所以背后的想法是在我自己的表中创建,将原始表中的记录逐个移动到新表中并重命名表。最后一步是重新创建外键。