mysql优化更新连接性能索引
我有一个疑问:mysql优化更新连接性能索引,mysql,sql,mariadb,Mysql,Sql,Mariadb,我有一个疑问: "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_
"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)
“在R.intern\u id=P.intern\u id或R.intern\u id\u decoded=P.intern\u id或R.intern\u id\u full\u decode=P.intern\u id SET R.found\u id=P.id时,将更新请求R JOIN profile解释为P,其中R.id>=28000001和R.id我将使用多个连接执行此逻辑:
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;
更新请求r左加入
剖面图p1
在r.intern_id=p1.intern_id左连接上
剖面图p2
在r.intern_id_decoded=p2.intern_id和p1.id为空左连接
剖面p3
在r.intern_id_full_decode=p3.intern_id和p2.id上为空
设置r.found_id=合并(p1.id、p2.id、p3.id)
其中,R.id>=28000001和R.id我将使用多个连接执行此逻辑:
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;
更新请求r左加入
剖面图p1
在r.intern_id=p1.intern_id左连接上
剖面图p2
在r.intern_id_decoded=p2.intern_id和p1.id为空左连接
剖面p3
在r.intern_id_full_decode=p3.intern_id和p2.id上为空
设置r.found_id=合并(p1.id、p2.id、p3.id)
当R.id>=28000001且R.id时,我将执行3次分块的更新
——在
条件下为每个更新一次
要更新的10K行太多了;将其调低到1K。这意味着将块调低到200K(速度可能更快)
(每组3的范围相同,因此有助于缓存R。)
可能索引(found\u id)
会有所帮助,但这不是一个给定的值
有关更多分块建议,请参阅,特别是在开始操作之前查找1000行的提示:
SELECT id WHERE id > ... AND found_id IS NULL LIMIT 1000,1;
然后将其作为限制,而不是第200万行。这里的目标是平衡更新的行数。我将进行3次分块的更新
——在条件下,每个更新一次
要更新的10K行太多了;将其调低到1K。这意味着将块调低到200K(速度可能更快)
(每组3的范围相同,因此有助于缓存R。)
可能索引(found\u id)
会有所帮助,但这不是一个给定的值
有关更多分块建议,请参阅,特别是在开始操作之前查找1000行的提示:
SELECT id WHERE id > ... AND found_id IS NULL LIMIT 1000,1;
然后将其作为限制,而不是第200万行。这里的目标是平衡更新的行数。我似乎记得MySQL在执行范围时停止使用索引。尝试先将R.found\u id设置为NULL。输出没有变化。我似乎记得MySQL在执行范围时停止使用索引。尝试将R.found\u id设置为NULL首先为空。输出没有变化Sadly我现在正在使用它,速度相当快。性能可能比以前提高10-15倍。谢谢我现在正在使用它,速度相当快。性能可能比以前提高10-15倍。谢谢