【问题标题】:mysql optimization UPDATE JOIN performance indexesmysql优化UPDATE JOIN性能指标
【发布时间】:2018-01-10 18:00:14
【问题描述】:

我有这个查询:

"explain UPDATE requests R JOIN profile as P ON R.intern_id = P.intern_id OR R.intern_id_decoded = P.intern_id OR R.intern_id_full_decode = P.intern_id SET R.found_id=P.id WHERE R.id >= 28000001 AND R.id <= 28000001+2000000 AND R.found_id is NULL"
1       UPDATE  R       NULL    range   PRIMARY,intern_id_customer_id_batch_num,id_found_id     PRIMARY 4       NULL    3616888 10.00   Using where
1       SIMPLE  P       NULL    ALL     intern_id_dt_snapshot,intern_id NULL    NULL    NULL    179586254       27.10   Range checked for each record (index map: 0x6)

执行该查询大约需要 40 秒,它从 200 万行中更新了 5000-10000 行。

我目前正在更新 200 万行“作业”以使联接执行得更快。 目前全表1.7亿条记录。

解释显示第二部分没有使用索引,我不确定这是否正确。 intern_id 字段是 varchars,found_id 和 id 是 INT

解释输出看起来是否正常工作? 我注意到第二行没有使用索引,不知道这是否正常。

【问题讨论】:

  • 我似乎记得 MySQL 在您执行范围时停止使用索引。尝试把 R.found_id IS NULL 先放。
  • 遗憾的是输出没有变化

标签: mysql sql mariadb


【解决方案1】:

我会使用多个连接来执行此逻辑:

UPDATE requests r LEFT JOIN
       profile p1
       ON r.intern_id = p1.intern_id LEFT JOIN
       profile p2
       ON r.intern_id_decoded = p2.intern_id AND p1.id IS NULL LEFT JOIN
       profile p3
       ON r.intern_id_full_decode = p3.intern_id AND p2.id IS NULL
    SET r.found_id = COALESCE(p1.id, p2.id, p3.id)
    WHERE R.id >= 28000001 AND R.id <= 28000001 + 2000000 AND
          R.found_id is NULL;

数据库在JOIN 条件下优化OR 非常糟糕。使用明确的JOINs 可能会更好。

ON 条件也确保只有第一个匹配项。

【讨论】:

  • 我现在正在玩它,它的速度相当快。性能可能比以前好 10-15 倍。谢谢
【解决方案2】:

我会做 3 个分块的 UPDATEs -- 每个 ON 条件一个。

10K 行更新过多;把它调低到大约 1K。这意味着将分块降低到 200K。 (速度可能会更快。)

UPDATE ... ON P.intern_id = R.intern_id          SET ... WHERE ...
UPDATE ... ON P.intern_id = R.intern_id_decoded  SET ... WHERE ...
UPDATE ... ON P.intern_id = R.intern_id_full     SET ... WHERE ...

(每组 3 个的范围相同,从而有助于 R 的缓存。)

INDEX(found_id) 可能会有所帮助,但这不是给定的。

请参阅here 了解更多分块建议,尤其是在开始操作之前查找 1000 行的提示:

SELECT id WHERE id > ... AND found_id IS NULL LIMIT 1000,1;

然后将其用作限制而不是百万分之一。这里的目标是平均更新的行数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多