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倍。谢谢