【问题标题】:Break this Query into batches将此查询分成批次
【发布时间】:2012-01-30 10:23:03
【问题描述】:

我有一个MySQL表contacts,结构如下

+--------------+----------+------+------+---------+ ----------------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +--------------+----------+------+------+---------+ ----------------+ |编号 |整数(11) |否 |优先级 |空 |自动增量 | |联系人ID |整数(11) |否 |穆尔 | 0 | | |联系人 ID |整数(11) |否 |穆尔 | 0 | | +--------------+----------+------+------+---------+ ----------------+

contactee_id 和contacter_id 都是id,共同定义了两个用户之间的关系。为了计算关系的数量,用户有,我有以下查询

INSERT INTO 关注者(id,关注者)
   选择contactee_id,1
     来自联系人
     在重复键上
      更新追随者 = 追随者 + 1

这个查询的问题是它锁定 contacts 表的时间过长(超过 16 分钟)。我想分批完成,这样SQL就不会锁定联系人表太久。我想到了几种方法,但它们都需要锁定整个表。有没有办法做到这一点?

【问题讨论】:

  • 您的联系人包含多少行?有多少追随者?能贴一下insert的执行计划吗?
  • 联系人表包含约 30m 行。

标签: mysql sql


【解决方案1】:

如果你只想计算关系的数量,请使用 count 和 group by 像

SELECT contactee_id,count(contacter_id) FROM contacts group by contactee_id;

这将为您提供所有联系人 ID 和每个联系人的联系人 ID 数量

【讨论】:

  • 分组也会锁定表。
【解决方案2】:

对一些记录运行查询,然后将最后一条记录的 id 保存在表或文件系统中,从该 id 开始下一个查询并在每个周期更新它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2017-06-01
    • 2020-10-13
    • 2019-09-08
    相关资源
    最近更新 更多