我有一个疑问:
"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输出看起来是否正常工作?我注意到第二行没有使用索引,不确定这是否正常。
2条答案
按热度按时间vyu0f0g11#
我将使用多个连接来执行此逻辑:
数据库在优化方面非常差
OR
在JOIN
条件。有了明确的解释可能会更好JOIN
s。这个
ON
条件也只能保证第一场比赛。jgovgodb2#
我会做3块
UPDATEs
--每个人一个ON
条件。要更新的10k行过多;把它调低到1k左右。这就意味着要把块调低到200k(速度可能更快。)
(每组3的范围相同,因此有助于r的缓存。)
可能吧
INDEX(found_id)
会有帮助,但这不是一个既定的。有关更多分块建议,请参见此处,特别是关于在开始操作之前查找1000行的提示:
然后用它作为极限,而不是百万分之二百万。这里的目标是均衡更新的行数。