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

工作中遇到需要将一个表中的数据按照对应规则填入别的表中的情况

例如

表1 a

a1    a2

11     90889

32     31241

12     52123

表2 b

b1     b2

11

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

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

5w条数据用时0.7s

联合查询方式

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

explain

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

用时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语句的效率一般来说还是需要经过测试才能的出想要的解。

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

上一篇:Oracle学习笔记--第3章 使用sql*plus工具


下一篇:小白学数据分析----->移动游戏的使用时长分析