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語句的效率通常來講仍是須要通過測試才能的出想要的解。

而對於問題而言,聯合查詢的方式是更加通用的!!子查詢的方式邏輯容易理解,部分可使用的狀況下有更好的效率。

相關文章
相關標籤/搜索