工做中遇到须要将一个表中的数据按照对应规则填入别的表中的状况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语句的效率通常来讲仍是须要通过测试才能的出想要的解。
而对于问题而言,联合查询的方式是更加通用的!!子查询的方式逻辑容易理解,部分可使用的状况下有更好的效率。