mysql 索引条件推送_MySQL 处理where条件 index condition pushdown索引条件下推
5.6之后,MySQL的優化技術
在使用二級索引過濾where條件時,減少回表的次數 以及 MySQL server層和引擎層交互的次數
1.數據庫如何處理where條件
index key(index first key? index last key)
確定sql查詢在索引中的連續范圍(起始+終止)
index filter
在起始到終止范圍之內,使用索引過濾不符合條件的記錄
table filter
不能使用索引處理了,回表(one by one),進行條件過濾
——————————
index first key 的提取規則
從索引(組合索引)的第一個鍵值開始
如果第一個鍵值存在,并且是=或者>=,則將該條件加入index first key,然后繼續判斷第二個鍵值,判斷條件一樣
如果遇到一個鍵值是>(范圍之后全失效),則將該條件加入index first key之后,終止
如果第一個鍵不存在(帶頭大哥不能死),終止
index last key 的提取規則
與index first key 相反
index filter 的提取規則
從索引的第一個鍵值開始
如果索引的第一個鍵值為=,則跳過,判斷第二個鍵值,判斷條件一樣
如果索引的第一列為> >= < <= 中的幾種,則,跳過第一列,將其余where 條件中,索引想過的列全部加入index filter中
如果索引的第一列為> >= < <= 之外的條件,則,將該條件以及where條件中所有與索引相關的列全部加入index filter中
如果第一列不包含查詢條件,則,將所有與索引相關的條件全部加入index filter中
table filter的提取條件
跟索引無關的列的查詢條件,全部加入table filter中
2.index condition pushdown
ICP
索引條件下推
提前執行
icp的優化用于 range ref eq_ref等訪問方法
innodb 和 myisam
idx_n_a(name,age)
select * from user where name < 'c' and age = 10
(1)不使用ICP
范圍之后全失效,僅僅會用到索引的第一列
從索引中one by one地取出符合條件的記錄,然后利用主鍵讀取整行
對記錄的完整行利用age=10這個條件進行判斷
重復上述過程直至沒有滿足條件的行
(2)使用ICP
從索引中one by one地取出符合條件的記錄,然后利用索引的其他字段的條件進行判斷
如果符合索引上的全部條件,才利用主鍵索引讀取完整行
使用了ICP之后,explain的結果extra列出現 using indexcondition
ICP的使用
(1)需要進行ICP優化的query語句,通常是where條件里面都是范圍查詢
(2)該查詢語句必須用到二級索引
(3)如果是覆蓋索引,直接index scan,就沒有必要進行ICP了
(4)innodb 和 myisam都可以
(5)ICP優化策略用于range ref eq_ref
(6)5.6之后的版本
總結
以上是生活随笔為你收集整理的mysql 索引条件推送_MySQL 处理where条件 index condition pushdown索引条件下推的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在java中如何输入(Java中如何输入
- 下一篇: 华硕主板选择s4还是s5(华硕商城ASU