mysql 下的update select from的两种方式比较

工做中遇到须要将一个表中的数据按照对应规则填入别的表中的状况sql

例如测试

表1 a优化

a1    a2spa

11     90889blog

32     31241索引

12     52123效率

 

表2 bdate

b1     b2select

11sql语句

12

13

其中a1与b1是同一个字段(好比存的都是姓名)

a2与b2是同一字段

需求:如今须要经过a1,b1将a2导入到b2中

条件:a1,b1一一对应,且每一条a1都有对应b1与之对应

例句子查询方式

update
balancesheet b
set
b.cs=
(
      select stockCode from company c
      where c.id=b.comid
)

explain

5w条数据用时0.7s

 

联合查询方式

update
balancesheet b
inner join
company c
using(stockCode)
set
b.cs=c.stockCode

explain

用时0.8s

因为更新的目标表只有一个,优化器没有办法改变关联的顺序。在有合适的索引的状况下,子查询的效率反而高于关联查询!跟咱们的刻板印象不一样!

条件:a1,b1一一对应,并非每一条a1都有对应b1与之对应

例句子查询方式

update 
balancesheet b
set 
b.cs=
(
      select stockCode from company c
      where c.id=b.comid
)

通过漫长的等待以后,

提示子查询返回超过一条结果??

[Err] 1242 - Subquery returns more than 1 row

能够推算到缘由应该是否是每一条a1都能找到b1,优化器的执行路径发生了变化!

 

这时只能寄但愿于联合查询

联合查询方式

update 
balancesheet b
inner join
company c
using(stockCode)
set 
b.cs=c.stockCode

结果是能够顺利执行!!ok!!

 

这里咱们能够看到不一样索引,不一样的数据对应条件对sql的执行路径产生了没法预估的影响。

刻板影响也不必定是正确的!

对于sql语句的效率通常来讲仍是须要通过测试才能的出想要的解。

而对于问题而言,联合查询的方式是更加通用的!!子查询的方式逻辑容易理解,部分可使用的状况下有更好的效率。

相关文章
相关标签/搜索