【问题标题】:Updating 10 million rows while having a check with another table在检查另一个表的同时更新 1000 万行
【发布时间】:2016-02-05 20:39:38
【问题描述】:

表 A 中有 1200 万行,表 B 中有 1000 万行。 现在这两个表都有一个共同的字段,比如 user_id。

现在我在表 A 中添加了一列来添加 B 的主键。

所以表格是这样的

Table A
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id     | int(11)      | NO   |     | NULL    |                |
| b_id        | int (11)     | YES  | MUL | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

Table B
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id     | int(11)      | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

现在我想更新表 A 中的 b_id。为此,我编写了以下查询:

update A
set A.b_id = (select B.id from B
and A.user_id = B.user_id
);

但即使在索引它并以 100K 的块执行它之后,它也需要很长时间(每个大约 3 分钟)。

有没有更好更快的更新方式?

【问题讨论】:

  • mysql 或 sql-server,使用正确的标签
  • 加入不是更贵。
  • b.user_id 是否已编入索引?它看起来不像。 (b.user_id, b.id) 上的综合索引应该会有所帮助
  • @FuzzyTree 是的
  • select B.id from B and A.user_id = B.user_id——这种语法还能用吗……?

标签: mysql mysqldump mysql-python


【解决方案1】:
update A
SET A.b_id = B.id
FROM Table A
INNER JOIN TABLE B ON A.user_id = B.user_id

确保您在 user_id 列上设置了索引。

尚不能评论:历史上,只要没有重复数据,在 Mysql 中 JOINS 的速度就会更快。

【讨论】:

  • 在这种情况下加入不是很昂贵,因为我们有大量数据。另外,我担心内存占用。
  • 我花了很多时间来找到正确的查询。而这个效果最好。谢谢布拉克
猜你喜欢
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2016-01-14
  • 1970-01-01
  • 2021-12-15
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多