mysql优化更新连接性能指标

t2a7ltrp  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(290)

我有一个疑问:

"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万行的“jobs”以使join执行得更快。目前整张表有1.7亿条记录。
解释显示了第二部分没有使用索引,我不确定这是否正确。intern\u id字段是varchars,found\u id和id是int
explain输出看起来是否正常工作?我注意到第二行没有使用索引,不确定这是否正常。

vyu0f0g1

vyu0f0g11#

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

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;

数据库在优化方面非常差 ORJOIN 条件。有了明确的解释可能会更好 JOIN s。
这个 ON 条件也只能保证第一场比赛。

jgovgodb

jgovgodb2#

我会做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) 会有帮助,但这不是一个既定的。
有关更多分块建议,请参见此处,特别是关于在开始操作之前查找1000行的提示:

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

然后用它作为极限,而不是百万分之二百万。这里的目标是均衡更新的行数。

相关问题