工做中遇到須要將一個表中的數據按照對應規則填入別的表中的狀況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語句的效率通常來講仍是須要通過測試才能的出想要的解。
而對於問題而言,聯合查詢的方式是更加通用的!!子查詢的方式邏輯容易理解,部分可使用的狀況下有更好的效率。