mysql中semi join的優化策略介紹

2021-06-28 06:54:30 字數 1490 閱讀 3186

1. 背景介紹

什麼是semi-join?

所謂的semi-join是指semi-join子查詢。 該子查詢具有如下結構:

select ... from outer_tables where expr in (select ... from inner_tables ...) and ...
即在where條件的「in」中的那個子查詢。

這種查詢的特點是我們只關心outer_table中與semi-join相匹配的記錄。

換句話說,最後的結果集是在outer_tables中的,而semi-join的作用只是對outer_tables中的記錄進行篩選。這也是我們進行semi-join優化的基礎,即我們只需要從semi-join中獲取到最少量的足以對outer_tables記錄進行篩選的資訊就足夠了。

所謂的最少量,體現到優化策略上就是如何去重。

以如下語句為例:

select * from country 

where

country.code in

(select city.country

from city

where city.population>1*1000*1000);

當中的semi-join: 「
select city.country 

from city

where city.population>1*1000*1000

」 可能返回的結果集如下: china(beijin), china(shanghai), france(paris)...

我們可以看到這裡有2個china,分別來至2條城市記錄beijin和shanghai, 但實際上我們只需要1個china就足夠對outer_table 

country進行篩選了。所以我們需要去重。

2. mysql支援的semi-join策略

mysql支援的semi-join策略主要有5個,它們分別為:

1. duplicateweedout: 使用臨時表對semi-join產生的結果集去重。

對應的匹配條件為:

2. firstmatch: 只選用內部表的第1條與外表匹配的記錄。

對應的匹配條件為:

3. loosescan: 把inner-table資料基於索引進行分組,取每組第一條資料進行匹配。

對應的匹配條件為:

4. materializelookup: 將inner-table去重固化成臨時表,遍歷outer-table,然後在固化表上去尋找匹配。

對應的匹配條件:

5. materializescan: 將inner-table去重固化成臨時表,遍歷固化表,然後在outer-table上尋找匹配。

對應的條件:

參考:

1.mysql** (sql/sql_select.cc 的setup_semijoin_dups_elimination函式)

2.askmonty的knowledgebase

mysql中的編碼 mysql中的編碼

一 mysql中的編碼 mysql show variables like collation mysql show variables like character set 預設是latin1編碼,會導致中文亂碼。修改庫的編碼 mysql alter database db name charac...

mysql中 變數 mysql中的變數

toc 變數 mysql本質是一種程式語言,需要很多變數來儲存資料。mysql中很多的屬性控制都是通過mysql中固有的變數來實現的。系統變數 系統內部定義的變數,系統變數針對所有使用者 mysql客戶端 有效。檢視系統所有變數 show variables like pattern mysql允許...

mysql中的函式名 MySQL中的函式

一 數學函式 數學函式主要用於處理數字,包括整型 浮點數等。abs x 返回x的絕對值 select abs 1 返回1 ceil x ceiling x 返回大於或等於x的最小整數 select ceil 1.5 返回2 floor x 返回小於或等於x的最大整數 select floor 1.5...