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

2021-09-22 14:12:37 字數 2172 閱讀 8570

索引是高效找到行的乙個方法,當能通過檢索索引就可以讀取想要的資料,那就不需要再到資料表中讀取行了。如果乙個索引包含了(或覆蓋了)滿足查詢語句中字段與條件的資料就叫做覆蓋索引。

使用explain,可以通過輸出的extra列來判斷,對於乙個索引覆蓋查詢,顯示為using index,mysql查詢優化器在執行查詢前會決定是否有索引覆蓋查詢

不是所有型別的索引都可以成為覆蓋索引。覆蓋索引必須要儲存索引的列,而雜湊索引、空間索引和全文索引等都不儲存索引列的值,所以mysql只能使用b+tree索引做覆蓋索引

不同的儲存引擎實現覆蓋索引都是不同的,並不是所有的儲存引擎都支援它們

覆蓋索引是一種非常強大的工具,能大大提高查詢效能,只需要讀取索引而不用讀取資料有以下一些優點

1、索引項通常比記錄要小,所以mysql訪問更少的資料

2、索引都按值的大小順序儲存,相對於隨機訪問記錄,需要更少的i/o

3、大多數據引擎能更好的快取索引,比如myisam只快取索引

4、覆蓋索引對於innodb表尤其有用,因為innodb使用聚集索引組織資料,如果二級索引中包含查詢所需的資料,就不再需要在聚集索引中查詢了

mysql建立多列索引(聯合索引)有最左字首的原則,即最左優先,如:

欄位有3列,a,b,c,建立索引:idx_a_b_c

則生效的查詢條件有:

a =x

a =x and b=y 或者(b =y and a=x,即順序不影響,sql優化器會自動處理,以下同理)

a =x and c =y

a=x and b=y and c=z

「索引條件下推」,稱為 index condition pushdown (icp)是mysql中乙個常用的優化,尤其是當mysql需要從一張表裡檢索資料時。 如果沒有icp,儲存引擎將會根據where子句的條件遍歷整個表單資料,然後返回給mysql伺服器。啟用icp,如果可以通過使用索引的列來滿足where條件,mysql伺服器將where條件的這部分推送到儲存引擎。然後,儲存引擎通過使用索引來確定推送的條件,並且通過這樣的方式從表中讀取行。 icp可以減少儲存引擎必須訪問基礎表的次數以及mysql伺服器必須訪問儲存引擎的次數。

不使用icp的查詢sql流程圖

過程解釋

①:mysql server發出讀取資料的命令,這是在執行器中執行如下**段,通過函式指標和handle介面呼叫儲存引擎的索引讀或全表表讀。此處進行的是索引讀。

if (in_first_read)

else

error= info->read_record(info);

②、③:進入儲存引擎,讀取索引樹,在索引樹上查詢,把滿足條件的(經過查詢,紅色的滿足)從表記錄中讀出(步驟④,通常有io),從儲存引擎返回⑤標識的結果。此處,不僅要在索引行進行索引讀取(通常是記憶體中,速度快。步驟③),還要進行進行步驟④,通常有io。

⑥:從儲存引擎返回查詢到的多條元組給mysql server,mysql server在⑦得到較多的元組。

⑦–⑧:⑦到⑧依據where子句條件進行過濾,得到滿足條件的元組。注意在mysql server層得到較多元組,然後才過濾,最終得到的是少量的、符合條件的元組。

使用icp的查詢sql流程圖

過程解釋

①:mysql server發出讀取資料的命令,過程同圖一。

②、③:進入儲存引擎,讀取索引樹,在索引樹上查詢,把滿足已經下推的條件的(經過查詢,紅色的滿足)從表記錄中讀出(步驟④,通常有io),從儲存引擎返回⑤標識的結果。此處,不僅要在索引行進行索引讀取(通常是記憶體中,速度快。步驟③),還要在③這個階段依據下推的條件進行進行判斷,不滿足條件的,不去讀取表中的資料,直接在索引樹上進行下乙個索引項的判斷,直到有滿足條件的,才進行步驟④,這樣,較沒有icp的方式,io量減少。

⑥:從儲存引擎返回查詢到的少量元組給mysql server,mysql server在⑦得到少量的元組。因此比較圖一無icp的方式,返回給mysql server層的即是少量的、符合條件的元組。

另外,圖中的部件層次關係,不再進行解釋。

索引最左字首原則

今天在觀察慢sql統計的時候,發現了乙個sql的平均耗時長,而且總的掃瞄行數大,分析對應表的ddl,發現此表中只有乙個唯一索引index1 a,b,c 但是在查詢條件中沒有帶上a欄位,導致這個查詢sql沒有走索引,從而導致了全表掃瞄。這裡涉及到乙個索引最左字首原則,我們來一起看一下。下述摘自 通常我...

mysql索引的最左字首原則

1.我們先建立表 create table test a int b int,c int,d int,key index abc a,b,c engine innodb default charset utf8 2.插入一些資料 drop procedure if exists proc initd...

MySql最左字首原則

企業的筆試題,對資料庫這塊了解很淺,所以還是記錄一下吧。b tree 索引和 hash 索引的對比 對於 b tree 和 hash 資料結構的理解能夠有助於 不同儲存引擎下使用不同索引的查詢效能的差異,尤其是那些允許你選擇 b tree 或者 hash 索引的記憶體儲存引擎。b tree 索引的特...