SQL優化 邏輯優化

2022-10-10 06:15:08 字數 1734 閱讀 5482

1)外連線消除

①外連線簡介

1)left join / left outer join:左外連線

左向外連線的結果集包括:left outer子句中指定的左表的所有行,而不僅僅是連線列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。

2)right join / right outer join:右外連線

右向外連線是左向外聯接的反向連線。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。

3)full join / full outer join:全外連線

全外連線返回左表和右表中的所有行。當某行在另乙個表中沒有匹配行時,則另乙個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。

②外連線消除

把外連線變為內連線 a outer join b 變形為 a join b

③外連線消除的意義

a)查詢優化器在處理外連線操作時所需執行的操作和時間多於內連線。

b)外連線消除後,優化器在選擇多表連線順序時,可以有更多更靈活的選擇,從而可以選擇更好的表連線順序,加快查詢執行的速度。

c)表的一些連線演算法(如塊巢狀連線和索引迴圈連線等)在將規模小的或篩選條件最嚴格的表作為「外表」(放在連線順序的最前面,是多層迴圈體的外迴圈層),可以減少不必要的i/o開銷,能加快演算法執行的速度。

④外連線消除的條件

where子句中的條件滿足「空值拒絕」(又稱為「reject-null」條件)。

where條件可以保證從結果中排除外連線右側(右表)生成的值為null的行(即條件確保應用在右表帶有空值的列物件上時,條件不滿足,條件的結果值為flase或unkonowen,這樣右表就不會有值為null的行生成),所以能使該查詢在語義上等效於內連線。

explain select * from x left join y on (x.x_num=y.y_num)

where y.y_num is not null;

⑤示例a)辨析on和where的差異

on t_1_id = t_2_id:t_1_id 和 t_2_id 進行連線

where t_1_id = t_2_id:當t_1_id 和 t_2_id的值相等

⑥外連線消除總結

a)注意外連線與內連線的語義差別

b)外連線優化的條件:空值拒絕

c)外連線優化的本質:語義上是外連線,但wher條件使得外連線可以蛻化為內連線

2)連線消除

①情況一(mysql不支援)

唯一鍵/主鍵作為連線條件,三表內連線可以去掉中間表(中間表的列只作為連線條件)。

②情況二(mysql不支援)

一些特殊形式,可以消除連線操作(可消除的表除了作為連線物件外,不出現在任何子句中)。

③情況三(mysql不支援)

主外來鍵關係的表進行的連線,可消除主鍵表,這不會影響對外鍵表的查詢。

④總結a)注意連線消除與外連線消除的技術差別。

b)連線消除去掉的是被連線的某個物件。

c)外連線消除去掉的是外連線的語義,變形為內連線。

3)巢狀連線消除

①概念連線存在多個層次,用括號標識連線的優先次序。巢狀連線消除,就是消除巢狀的連線層次,把多個層次的連線減少為較少層次的連線,盡量「扁平化」。

②總結a)巢狀連線消除的連線的層次,這是一種連線的語義順序的變化。

b)連線消除,消掉的是一些被連線的物件。

c)外連線消除,消掉的是外連線的語義,使得外連線變形為內連線。

sql優化之邏輯優化

在單機資料庫系統中進行優化。面臨的問題,比如說給定乙個要query的sql語句,查詢優化演算法的目標就是找到查詢的乙個具有最小執行花費的執行計畫,如果找到了,那麼這樣的執行計畫一定具有最快的響應時間。查詢語句可表示成一顆二叉樹,其中葉子代表關係,內部結點是運算子,表示左右子樹的連線關係,子樹是sql...

查詢優化 SQL優化

查詢優化注意點 代表查詢速度比較 1 所有查詢必須注意 的使用必要性 cout 1 cout 2 字段 主鍵索引 字段 普通索引 字段 沒有索引 3 乙個字段 多個字段 欄位多越慢 4 大於10000和大於10001的區別 後者大於前者 5 列沒別名 列 有別名6 兩個條件,where時應該將符合資...

SQL優化 索引優化

一 發現哪些sql語句有效能問題 開啟mysql慢查詢日誌對sql語句進行監控 show variables like slow query log 檢視是否開啟慢查詢日誌 set global slow query log on 開啟慢查詢日誌 set global log queries not...