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

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語句的效率一般來說還是需要經過測試才能的出想要的解。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM