优化MYSQL中的UPDATE JOIN查询。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优化MYSQL中的UPDATE JOIN查询。相关的知识,希望对你有一定的参考价值。

我正在运行下面的SQL查询,在表B中,id是B的PRIMARY KEY,在表A中,b_id只是A中的一列,应该与表B的id值相同。

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的主键,在表A中,b_id只是A中的一列,应该与表B的id值相同。

我的问题是,有什么方法可以在不改变表定义的情况下优化上述查询吗?谢谢。

答案
    on A.b_id  = B.id 
   SET B ...
   WHERE
   and b.col5 = 1234 
   and b.col6 = 1 
   and b.col7 = 'val7';

不知道会不会以 AB. 所以,我给大家推荐一下各家的索引。

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

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

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

另一答案

你使用 次级查询 来执行JOIN,以减少参与JOIN的行数。

由于您只更新表 B'的列,所以你只把B放在 更新 子句。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';

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

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

MySQL - 优化查询(LIMIT、OFFSET、JOIN)> 2500 万行

Mysql(19)—join关联查询的原理以及优化手段

Mysql优化系列之——优化器对子查询的处理

WHERE 子句中带有子查询的 MYSQL UPDATE 查询 - 优化

MySQL:优化 JOIN 查询