1. 程式人生 > >MySQL優化器功能開關optimizer_switch

MySQL優化器功能開關optimizer_switch

tin fan filter 條件過濾 optimize 5.5 尋找 index 提交

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