mysql索引下推 MySQL中的索引下推

2021-10-19 01:11:04 字數 1307 閱讀 2973

前段時間看了一下資料庫相關知識,出現了索引下推這個名詞,有必要記錄下來作為知識儲備。索引下推用一句話總結是:索引下推是資料庫檢索資料過程中為減少回表次數而做的優化。

首先介紹下什麼是資料庫回表,回表是一種資料庫檢索過程。通常發生在使用二級索引檢索非主索引資料的過程中。舉個例子:

usertest資料表

假設有上面一張表,上面的id欄位是主鍵索引,age是普通索引。

對比下面兩條sql語句:

select id from usertest where age = 10;

select name from usertest where age = 10;

第一條sql語句不會產生回表(暫時不清楚不要緊):普通索引儲存的值是主鍵的值。也就是說age索引裡面儲存的結構是下面的情況:

age索引

根據age查詢id的時候,索引中的值完全可以覆蓋查詢結果集字段時,不會產生回表(暫時不清楚還不要緊)操作。

由此也可以看出第二條sql語句會產生回表是因為查詢的結果集無法通過索引中的值直接獲取。需要根據age查詢到的id值再回到主鍵索引裡面再次查詢,這個過程叫做回表。

然後再看索引下推

還是上面的usertest表,只是索引變了,id欄位是仍主鍵索引,但是我們加上乙個復合索引name_age(name,age)。

執行下面一條sql語句:

select * from usertest where name like 'a%' and age = 10;

在mysql5.6之前的執行流程大概是這樣的:

1.根據最左字首原則,執行name like 'a%'可以快速檢索出id的值為1,5。

name like 'a%'查詢結果

2.然後根據id的值進行回表操作,再次進行過濾age=10的資料。

查詢id=1回表1次,id=5回表1次,這個過程總共回表了2次。

可能到這裡都會有疑問,為什麼不在索引裡面直接過濾age=10的資料,因為復合索引裡面也存了age的資料,這樣明明可以減少回表1次?恭喜啦,mysql5.6以後就這麼做了,這就是索引下推。

可以看出,索引下推具體是在復合索引的查詢中,針對特定的過濾條件而進行減少回表次數而做的優化(個人覺得本來就該這麼設計的)。

Mysql效能優化 什麼是索引下推?

索引下推 index condition pushdown 簡稱icp,在mysql5.6的版本上推出,用於優化查詢。在不使用icp的情況下,在使用非主鍵索引 又叫普通索引或者二級索引 進行查詢時,儲存引擎通過索引檢索到資料,然後返回給mysql伺服器,伺服器然後判斷資料是否符合條件 在使用icp的...

MySQL 覆蓋索引 最左字首原則 索引下推

索引是高效找到行的乙個方法,當能通過檢索索引就可以讀取想要的資料,那就不需要再到資料表中讀取行了。如果乙個索引包含了 或覆蓋了 滿足查詢語句中字段與條件的資料就叫做覆蓋索引。使用explain,可以通過輸出的extra列來判斷,對於乙個索引覆蓋查詢,顯示為using index,mysql查詢優化器...

innodb的索引下推

索引下推,是mysql優化聯合索引查詢的一種方案,叫做索引下推不如翻譯為索引條件下推更合適 index condition pushdown 簡稱icp,因為他實際上是把where中的查詢索引條件,下推給了儲存引擎 回表索引下推 索引覆蓋 預備知識 b tree 主鍵索引和非主鍵索引 聚簇索引和非聚...