SQL中 LEFT JOIN ON 條件的效率高低比較

時間 2021-06-02 13:04:48

1樓:野鴿知了

這裡按 MySQL 資料庫來說明,這兩個查詢語言,第一種是左連線的方式,第二種是左連線關聯子查詢的方式。

這裡面主要是第二種用了子查詢這種方式,關於這種情況下的子查詢,又叫派生表,MySQL 對這種情況,有兩種處理方式。第一種是把派生表物化,也就是生成臨時表,然後再做關聯操作。第二種會把派生表和外層查詢合併,重新調整 SQL 語句,比如這裡的第二種查詢方式,就有可能直接被重新調整為第一種,如果是這種方式,那二種寫法的效率肯定是一樣的。

這裡,根據問題,新建兩張測試表 t_a和 t_b 如下,兩張表 id 為主鍵。

t_at_b

執行下面語句檢視查詢語句一的執行計畫

explain SELECT * FROM t_a as a LEFT JOIN t_b as b ON a.id = b.id AND b.name = '123';

檢視執行計畫一如下

執行下面語句檢視查詢語句二的執行計畫

explain SELECT * FROM t_a as a LEFT JOIN (SELECT * FROM t_b WHERE name = '123') b ON a.id = b.id;

檢視執行計畫二如下

可以看出兩條語句的執行計畫是一樣的,從這裡就可以看出,第二種查詢語句,被重新調整為第一種,這時,其實這兩種語句的效率是一樣的。當然,這是資料量比較小的情況,資料量大的時候,也可以通過檢視執行計畫來檢視效率。

比如執行下面的語句

explain SELECT * FROM t_a A WHERE a.key2 in (SELECT key3 FROM t_b)

檢視執行計畫如下

可以看出這種情況下用到了子查詢(派生表)物化的方式來做關聯。所以如果用到子查詢物化做臨時表的方式,就多了建立和訪問臨時表的成本,這種效率肯定就更低了。

2樓:

首先你需要看是什麼資料庫

不同的資料庫有不同的優化方案

比如MySQL的優化器在這方面沒什麼建樹需要自己優化SQL

比如PostgreSQL的優化器有黑科技神經遺傳演算法題主給出的資料不足能匯出任何分析結論題主給出的資料不包含

資料庫資料庫版本

資料規模字段屬性

等資訊答主表示無法做出客觀的分析

Python 中如何自己實現防止 SQL 注入模組?

注入的手段無非是在拼接字串的時候加入一些SQL的關鍵字 那麼防止的話,就對傳入的字串進行檢查,對包含SQL關鍵字的輸入都視為非法 OceAn defexecute self,a,kw cursor kw pop cursor None try cursor cursor orself conn cu...

sparksql原始碼中sql語法驗證在哪?檢驗字段存在以及value合法

翟士丹 SQL語法的校驗,在parser的parse階段就可以驗證了。如 scala spark.sql select from group by org.apache.spark.sql.catalyst.parser.ParseException no viable alternative at...

sql資料庫中什麼情況該加索引index?

開心就好 1.表的某個字段值得離散度越高,該字段越適合選作索引的關鍵字。主鍵字段以及唯一性約束字段適合選作索引的關鍵字,原因就是這些欄位的值非常離散。尤其是在主鍵字段建立索引時,cardinality 基數,集的勢 的值就等於該錶的行數。MySQL 在處理主鍵約束以及唯一性約束時,考慮周全。資料庫使...