小编Oll*_*lle的帖子

如何在不锁定 MySQL 的情况下更新(非常)大的表

我有一个大表(58+ 百万条记录),它表示第二个表中两条记录(玩家和目标)之间的关系。

不幸的是,设计我们模式的人并没有考虑周全,而是选择使用用户名来表示这种关系,而不是用户记录的数字 ID。随着事情的进展(就像他们通常所做的那样),我们的用户名不再是玩家的有效唯一表示,因此我需要将这些关系转换为使用数字 ID。

多亏了 Percona Toolkit,在不加锁的情况下添加字段很容易,它提供了 pt-online-schema-change 可以在实时表上进行 ALTER。但是,填充表格可能会更棘手。

表格看起来像这样(我已经剥离了不相关字段的创建),两个未填充的字段是player_idtarget_id

CREATE TABLE `player_targets` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `player` varchar(20) NOT NULL,
  `player_id` int(10) unsigned DEFAULT NULL,
  `target` varchar(20) NOT NULL,
  `target_id` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=58000000 DEFAULT CHARSET=latin1;

CREATE TABLE 'player_uuids' (
  `id`int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=600000 DEFAUL CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

我打算用这样的查询填充两个新字段:

UPDATE player_targets t
INNER JOIN player_uuids u1
  ON …
Run Code Online (Sandbox Code Playgroud)

mysql myisam locking update

5
推荐指数
1
解决办法
2万
查看次数

标签 统计

locking ×1

myisam ×1

mysql ×1

update ×1