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當中的semi-join: 「where
country.code in
(select city.country
from city
where city.population>1*1000*1000);
select city.country」 可能返回的結果集如下: china(beijin), china(shanghai), france(paris)...from city
where city.population>1*1000*1000
我們可以看到這裡有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...