有了索引下推優化,可以在有like條件查詢的情況下,減少回表次數。
對於user_table表,我們現在有(username,age)聯合索引
如果現在有乙個需求,查出名稱中以「張」開頭且年齡小於等於10的使用者資訊,語句如下:
select * from user_table where username like '張%' and age > 10
語句有兩種執行可能:
根據(username,age)聯合索引查詢所有滿足名稱以「張」開頭的索引,然後回表查詢出相應的全行資料,然後再篩選出滿足年齡小於等於10的使用者資料
根據(username,age)聯合索引查詢所有滿足名稱以「張」開頭的索引,然後直接再篩選出年齡小於等於10的索引,之後再回表查詢全行資料。
明顯的,第二種方式需要回表查詢的全行資料比較少,這就是mysql的索引下推。mysql預設啟用索引下推,我們也可以通過修改系統變數optimizer_switch的index_condition_pushdown標誌來控制
set optimizer_switch = 'index_condition_pushdown=off';
假設表t有聯合索引(a,b),下面語句可以使用索引下推提高效率
①:mysql server發出讀取資料的命令,過程同圖一。
②、③:進入儲存引擎,讀取索引樹,在索引樹上查詢,把滿足已經下推的條件的(經過查詢,紅色的滿足)從表記錄中讀出(步驟④,通常有io),從儲存引擎返回⑤標識的結果。此處,不僅要在索引行進行索引讀取(通常是記憶體中,速度快。步驟③),還要在③這個階段依據下推的條件進行進行判斷,不滿足條件的,不去讀取表中的資料,直接在索引樹上進行下乙個索引項的判斷,直到有滿足條件的,才進行步驟④,這樣,較沒有icp的方式,io量減少。
⑥:從儲存引擎返回查詢到的少量元組給mysql server,mysql server在⑦得到少量的元組。因此比較圖一無icp的方式,返回給mysql server層的即是少量的、符合條件的元組。
另外,圖中的部件層次關係,不再進行解釋
1、innodb引擎的表,索引下推只能用於二級索引(除了聚簇索引之外的索引都是二級索引(輔助索引),每乙個二級的記錄中除了索引列的值之外,還包含主健值。通過二級索引查詢首先查到是主鍵值,然後innodb再根據查到的主鍵值通過主鍵/聚簇索引找到相應的資料塊。)。innodb的主鍵索引(聚簇索引)樹葉子結點上儲存的是全行資料,所以這個時候索引下推並不會起到減少查詢全行資料的效果。
2、索引下推一般可用於所求查詢字段(select列)不全是聯合索引的字段,查詢條件為多條件查詢且查詢條件子句(where/order by)欄位全是聯合索引。
參考: (mysql索引篇之覆蓋索引、字首索引、索引下推)
(聚集索引與非聚集索引的總結)
(mysql的聚集索引與輔助索引)
mysql索引下推 MySQL中的索引下推
前段時間看了一下資料庫相關知識,出現了索引下推這個名詞,有必要記錄下來作為知識儲備。索引下推用一句話總結是 索引下推是資料庫檢索資料過程中為減少回表次數而做的優化。首先介紹下什麼是資料庫回表,回表是一種資料庫檢索過程。通常發生在使用二級索引檢索非主索引資料的過程中。舉個例子 usertest資料表 ...
innodb的索引下推
索引下推,是mysql優化聯合索引查詢的一種方案,叫做索引下推不如翻譯為索引條件下推更合適 index condition pushdown 簡稱icp,因為他實際上是把where中的查詢索引條件,下推給了儲存引擎 回表索引下推 索引覆蓋 預備知識 b tree 主鍵索引和非主鍵索引 聚簇索引和非聚...
索引覆蓋 最左字首 索引下推
什麼是索引覆蓋?怎麼用到索引覆蓋 索引覆蓋的情況,using index using index using where select from t where k betwee 3 and 5 這條語句的執行流程是什麼樣的?邊界查詢 回表的概念是什麼?索引覆蓋的概念是什麼,索引覆蓋的優點是什麼?最...