我有这样的疑问:
"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
解释输出看起来工作正常吗? 我注意到第二行没有使用索引,不确定这是否正常。
最佳答案
我将使用多个连接来执行此逻辑:
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
方面非常糟糕。使用显式的JOIN
可能会更好。
ON
条件还确保仅第一个匹配。
关于mysql优化UPDATE JOIN性能指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48193500/