標籤:rowid inter push base nbsp ora fir 產生 nes
MySQL 8.0新增特性
use_invisible_indexes:是否使用不可見索引,MySQL 8.0新增可以建立invisible索引,這一開關控制最佳化器是否使用invisible索引,on表示考慮使用。
MySQL 5.7新增
derived_merge:派生表合并,類似Oracle的視圖合并,當派生SQL中存在以下操作是無法展開UNION 、GROUP 、DISTINCT、LIMIT及彙總操作
duplicateweedout:是否使用使用暫存資料表對semi-join產生的結果集去重
condition_fanout_filter:cost模型在jion 代價計算時考慮condition,是否還要還要考慮condition上的filter,如果是on表示考慮
MySQL 5.6 新增
mrr和mrr_cost_based:針對多列索引,也叫複合式索引來做基本掃描,然後對匹配的記錄按照主鍵排序,這樣按照有序的主鍵順序從磁碟上掃描需要的全部記錄。根本功能是把對磁碟的隨機掃描轉化為順序掃描。
batched_key_access:對於多表join語句,當MySQL使用索引訪問第二個join表的時候,使用一個join buffer來收集第一個操作對象產生的相關列值。BKA構建好key後,批量傳給引擎層做索引尋找。key是通過MRR介面提交給引擎的. 這樣,MRR使得查詢更有效率。
block_nested_loop:將外層迴圈的行/結果集存入join buffer, 內層迴圈的每一行與整個buffer中的記錄做比較,從而減少內層迴圈的次數.
index_condition_pushdown:當ICP開啟時,用於二級索引的range、 ref、 eq_ref或ref_or_null掃描,如果部分where條件能使用索引的欄位,MySQL server會把這部分下推到引擎層,可以利用index過濾的where條件在儲存引擎層進行資料過濾。
use_index_extensions:索引擴充使用,主要用於INNODB的第二索引,也就是普通的索引,把索引中包含的主索引值利用到。比如主鍵為(a,b),索引為(c). 如果用到了索引c,那麼把索引變成(c,a,b) 這樣,就可以用到新的複合式索引了。不過這種場合用的也比較少,一般是根據組合主鍵中的第一個欄位和普通索引一起來做檢索的時候。
semijoin:是否啟用semijoin,MySQL主要支援以下五種半串連策略
DuplicateWeedout: 使用暫存資料表對semi-join產生的結果集去重。
FirstMatch: 只選用內部表的第1條與外表匹配的記錄。
LooseScan: 把inner-table資料基於索引進行分組,取每組第一條資料進行匹配。
Materializelookup: 將inner-table去重固化成暫存資料表,遍曆outer-table,然後在固化表上去尋找匹配。
MaterializeScan: 將inner-table去重固化成暫存資料表,遍曆固化表,然後在outer-table上尋找匹配。
firstmatch:只選用內表的第一條與外表匹配的記錄。
loosescan:把內表的資料基於索引分組,取每組第一條資料即可。
materialization和subquery_materialization_cost_based:把內表去重然後產生有對應索引的暫存資料表(有點類似其他資料中的物化視圖),然後通過外表的對應索引值遍曆這張暫存資料表。
MySQL 5.5及以下版本新增
engine_condition_pushdown :只用於NDB引擎,開啟後時按照WHERE條件過濾後的資料發送到SQL節點來處理,不開啟所有資料節點的資料都發送到SQL節點來處理。
index_merge
index_merge_intersection:如果有兩個單獨的索引都可用,但是其中任何一個都不是最佳化的,那麼最佳化器選擇合并兩個索引並且在他倆的結果集中做一個交集,然後根據這個交集對磁碟資料進行匹配。
index_merge_union:用於OR,把所有相關索引串連起來,找到記錄對應的ROWID,然後根據ROWID擷取磁碟上的資料。
index_merge_sort_union"用於OR,把所有相關索引串連起來,找到記錄對應的ROWID,並且好順序,然後根據ROWID擷取磁碟上的資料。
MySQL最佳化器功能開關optimizer_switch