【问题标题】:SQL UPDATE query taking too longSQL UPDATE 查询耗时过长
【发布时间】:2015-08-19 03:35:51
【问题描述】:

所以我对 MySQL 很陌生,如果两个表中都存在单元格值,我正在尝试运行查询来更新列,并且查询需要永远运行(它现在已经运行了 10 分钟,并且还没有结果)。我的一张桌子大约有 250,000 行,另一张大约有 80,000 行,所以我不确定为什么要花这么长时间。我使用的查询是:

USE the_db;
UPDATE table1
JOIN table2
ON table2.a = table1.b
SET table1.c = "Y"; 

我已经更改了表和列的名称,但查询完全一样。我在这里查看了其他答案,所有这些答案也都需要很长时间。任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 连接列上有索引吗? table1.c 的类型是什么?
  • 我没有索引,我对 SQL 很陌生,所以直到现在我才知道那是什么。我现在正在查找这方面的信息。而table1.c的类型是char(1)
  • Gordon Lindoff 下面给出了答案,这看起来正是您所需要的。祝你好运!

标签: mysql sql


【解决方案1】:

对于这个查询:

UPDATE table1 JOIN
       table2
       ON table2.a = table1.b
    SET table1.c = 'Y'; 

您想要在table2(a) 上建立索引:

create index idx_table2_a on table2(a);

此外,如果有多个 a 值与每个 b 匹配,那么您还可能生成大量中间行,这将对性能产生很大影响。

如果是这样,则将查询表述为:

UPDATE table1
    SET table1.c = 'Y'
    WHERE EXISTS (SELECT 1 FROM table2 WHERE table2.a = table1.b);

而且你需要相同的索引。

查询之间的区别在于,这个查询停在table2 中的第一个匹配行。

【讨论】:

  • a 的多个值与b 匹配,但是我只关心是否至少有一个匹配项,是否有一种方法可以让它忽略任何额外的值找到一个值?谢谢
  • 非常感谢,不到一秒钟就完成了,所以绝对是一个很大的加速!谢谢:)
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
相关资源
最近更新 更多