优化 MYSQL 中的 UPDATE JOIN 查询

Posted

技术标签:

【中文标题】优化 MYSQL 中的 UPDATE JOIN 查询【英文标题】:Optimize UPDATE JOIN query in MYSQL 【发布时间】:2020-08-06 05:56:26 【问题描述】:

我正在运行以下 SQL 查询:

UPDATE A 
  join B 
    on A.b_id  = B.id 
   SET B.col1 = 'val1'
     , B.col2 = ''
     , B.col3 = 1
 where a.col4 = 'val4' 
   and b.col5 = 1234 
   and b.col6 = 1 
   and b.col7 = 'val7';

在表 B 中,id 是 B 的 PRIMARY KEY,在表 A 中。b_id 只是 A 中的一列,应该与表 B 的 id 具有相同的值。

我的问题是,有没有办法在有/没有(首选)更改表定义的情况下优化上述查询?谢谢。

【问题讨论】:

当您寻求SQL查询优化方面的帮助时,您应该发布查询中引用的每个表的SHOW CREATE TABLE,以及您的SQL语句的EXPLAIN ...的输出。请不要让我们猜测您在表格中的列和索引。帮助我们为您提供帮助。 【参考方案1】:

您使用 SUBQUERY 执行 JOIN 以减少 JOIN 所涉及的行数。

由于你只更新表B的列,所以你只把B放在UPDATE子句中。建议使用 INNER JOIN 以防止一些不需要的更新。

增强效果如下图:-

 UPDATE B SET B.col1 = 'val1', B.col2 = '', B.col3 = 1 
     FROM (SELECT b_id FROM A WHERE a.col4='val4') as tableA
     INNER JOIN B ON tableA.b_id  = B.id 
     WHERE b.col5=1234 AND b.col6=1 AND b.col7='val7';

【讨论】:

我在这里看不到“增强”!?! :-( 你确定吗?当表“A”有大量数据时,join之前的子查询应该会产生一些影响。 好吧,首先,您的查询会导致语法错误。 其次,假设可以在不查看其组件表的底层结构的情况下对查询进行哪些改进是......好吧,礼仪让我无法说。【参考方案2】:
    on A.b_id  = B.id 
   SET B ...
   WHERE
   and b.col5 = 1234 
   and b.col6 = 1 
   and b.col7 = 'val7';

不知道是A还是B开头。所以,让我推荐每个索引:

B:  INDEX(col5, col6, col7, id)
A:  INDEX(b_id)
A:  INDEX(col4, b_id)

这些也将有助于 Ronnie 的子查询方法。

如果您有足够新的版本,请在添加这些索引之前和之后提供EXPLAIN UPDATE ...。 (旧版本的 mysql 没有该命令。)

【讨论】:

以上是关于优化 MYSQL 中的 UPDATE JOIN 查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql 如何优化left join

mysql 如何优化left join

mysql使用join做update操纵与使用join做查询时出现重复记录的问题

Mysql update inner join

update inner join set 和 update set from ,如何使用一个表中的字段更新另一个表中字段,MySQL和SqlServer不一样

MySQL SQL优化-让你脑洞大开