where條件應(yīng)用分析
描述
Mysql查詢返回結(jié)果 的響應(yīng)時(shí)間搂抒,掃描的行數(shù),返回的行數(shù)可以衡量查詢開銷。執(zhí)行計(jì)劃Extra列顯示的where條件應(yīng)用情況有好壞之分,本文主要對(duì)using index铺呵,using index;using where,using where,using index condition四種類型進(jìn)行區(qū)分掌实。
關(guān)鍵詞
mysql優(yōu)化 where條件 覆蓋索引 ICP
圖示
要點(diǎn)
-
數(shù)據(jù)庫(kù)是如何處理 where 中的條件的陪蜻?
所有SQL的where條件,均可歸納為3大類:Index Key (First Key & Last Key)贱鼻,Index Filter宴卖,Table Filter
對(duì) where 中過(guò)濾條件的處理滋将,根據(jù)索引使用情況分成了三種:index key, index filter, table filter
1). index key
用于確定SQL查詢?cè)谒饕械倪B續(xù)范圍(起始范圍+結(jié)束范圍)的查詢條件,被稱之為Index Key症昏。由于一個(gè)范圍随闽,至少包含一個(gè)起始與一個(gè)終止,因此Index Key也被拆分為Index First Key和Index Last Key肝谭,分別用于定位索引查找的起始掘宪,以及索引查詢的終止條件。也就是說(shuō)根據(jù)索引來(lái)確定掃描的范圍攘烛。
2). index filter
在使用 index key 確定了起始范圍和介紹范圍之后魏滚,在此范圍之內(nèi),還有一些記錄不符合where 條件坟漱,如果這些條件可以使用索引進(jìn)行過(guò)濾鼠次,那么就是 index filter。也就是說(shuō)用索引來(lái)進(jìn)行where條件過(guò)濾芋齿。
3). table filter
where 中的條件不能使用索引進(jìn)行處理的腥寇,只能訪問table,進(jìn)行條件過(guò)濾了觅捆。
-
什么是ICP赦役?
即所索引條件下推(index condition pushdown)
它能減少在使用 二級(jí)索引 過(guò)濾where條件時(shí)的回表次數(shù) 和 減少M(fèi)ySQL server層和引擎層的交互次數(shù)。在索引組織表中栅炒,使用二級(jí)索引進(jìn)行回表的代價(jià)相比堆表中是要高一些的掂摔。
也就是說(shuō)各種各樣的 where 條件,在進(jìn)行處理時(shí)职辅,分成了上面三種情況棒呛,一種條件會(huì)使用索引確定掃描的范圍;一種條件可以在索引中進(jìn)行過(guò)濾域携;一種必須回表進(jìn)行過(guò)濾;
在 MySQL5.6 之前鱼喉,并不區(qū)分Index Filter與Table Filter秀鞭,統(tǒng)統(tǒng)將Index First Key與Index Last Key范圍內(nèi)的索引記錄,回表讀取完整記錄扛禽,然后返回給MySQL Server層進(jìn)行過(guò)濾锋边。
而在MySQL 5.6之后,Index Filter與Table Filter分離编曼,Index Filter下降到InnoDB的索引層面進(jìn)行過(guò)濾豆巨,減少了回表與返回MySQL Server層的記錄交互開銷,提高了SQL的執(zhí)行效率掐场。
所以所謂的 ICP 技術(shù)往扔,其實(shí)就是 index filter 技術(shù)而已贩猎。只不過(guò)因?yàn)镸ySQL的架構(gòu)原因,分成了server層和引擎層萍膛,才有所謂的“下推”的說(shuō)法吭服。所以ICP其實(shí)就是實(shí)現(xiàn)了index filter技術(shù),將原來(lái)的在server層進(jìn)行的table filter中可以進(jìn)行index filter的部分蝗罗,在引擎層面使用index filter進(jìn)行處理艇棕,不再需要回表進(jìn)行table filter。