mysql优化UPDATE JOIN性能指标

标签 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_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/

相关文章:

python - 我需要使用有关 Django 程序中的 where 条件的 sql 语句的帮助

MySQL 更新不允许 header 名称?

java - 在 Hibernate 中检索多对多映射中的集合

sql - 在一列中存储多个标签

sql - 如何在 MariaDB 中更新基于连接表的行?

mysql - 我可以根据多个连接创建一个查询并求和吗?

mysql - 如何简化这个多选查询以加快执行速度?

mysql - 仅从 mysql 表中选择最后的日志,使用多列的 DISTINCT

php - 使用 Laravel Eloquent/MySQL 比较多个数据库行值

mysql - 使用正则表达式查询表以查找 A 或 B