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