首頁 >數據庫 >mysql教程 > 正文

mysql索引命中規則講解

轉載2020-01-27 20:59:400578
第11期線上培訓班

首先我們來了解一下最左匹配原則,如下:

1、先定位該sql的查詢條件,有哪些,那些是等值的,那些是范圍的條件。

2、等值的條件去命中索引最左邊的一個字段,然后依次從左往右命中,范圍的放在最后。

分析講解

1、mysql的索引分為聚簇索引和非聚簇索引,mysql的表是聚集索引組織表。

聚集規則是:有主鍵則定義主鍵索引為聚集索引;沒有主鍵則選第一個不允許為NULL的唯一索引;還沒有就使用innodb的內置rowid為聚集索引。

(免費學習視頻教程推薦:mysql視頻教程

非聚集索引也稱為二級索引,或者輔助索引。

2、mysql的索引無論是聚集索引還是非聚集索引,都是B+樹結構。聚集索引的葉子節點存放的是數據,非聚集索引的葉子節點存放的是非聚集索引的key和主鍵值。B+樹的高度為索引的高度。

3、索引的高度

聚集索引的高度決定了根據主鍵取數據的理論IO次數。根據非聚集索引讀取數據的理論IO次數還要加上訪問聚集索引的IO次數總和。實際上可能要不了這么多IO。因為索引的分支節點所在的Page因為多次讀取會在mysql內存里cache住。

mysql的一個block大小默認是16K,可以根據索引列的長度粗略估算索引的高度。

sql優化依據

SQL語句中的where條件,使用以上的提取規則,最終都會被提取到Index Key (First Key & Last Key),Index Filter與Table Filter之中。

Index First Key,只是用來定位索引的起始范圍,因此只在索引第一次Search Path(沿著索引B+樹的根節點一直遍歷,到索引正確的葉節點位置)時使用,一次判斷即可;

Index Last Key,用來定位索引的終止范圍,因此對于起始范圍之后讀到的每一條索引記錄,均需要判斷是否已經超過了Index Last Key的范圍,若超過,則當前查詢結束;

Index Filter,用于過濾索引查詢范圍中不滿足查詢條件的記錄,因此對于索引范圍中的每一條記錄,均需要與Index Filter進行對比,若不滿足Index Filter則直接丟棄,繼續讀取索引下一條記錄;

Table Filter,這是最后一道where條件的防線,用于過濾通過前面索引的層層考驗的記錄,此時的記錄已經滿足了Index First Key與Index Last Key構成的范圍,并且滿足Index Filter的條件,回表讀取了完整的記錄,判斷完整記錄是否滿足Table Filter中的查詢條件,同樣的,若不滿足,跳過當前記錄,繼續讀取索引的下一條記錄,若滿足,則返回記錄,此記錄滿足了where的所有條件,可以返回給前端用戶

分析

一條sql語句要執行完成需要經歷什么樣的過程?

當一條sql語句提交給mysql數據庫進行查詢的時候需要經歷以下幾步:

1、先在where解析這一步把當前的查詢語句中的查詢條件分解成每一個獨立的條件單元;

2、mysql會自動將sql拆分重組;

3、然后where條件會在B-tree index這部分進行索引匹配,如果命中索引,就會定位到指定的table records位置。如果沒有命中,則只能采用全部掃描的方式;

4、根據當前查詢字段返回對應的數據值。

如下圖:

b49c742c7bbbac9c632bf3ffe6750b9.png

相關文章教程推薦:mysql教程

以上就是mysql索引命中規則講解的詳細內容,更多請關注php中文網其它相關文章!

php中文網最新課程二維碼
  • 相關標簽:mysql 索引 命中 規則 講解
  • 本文轉載于:博客園,如有侵犯,請聯系[email protected]刪除
  • 相關文章

    相關視頻


    網友評論

    文明上網理性發言,請遵守 新聞評論服務協議

    我要評論
  • 專題推薦

    推薦視頻教程
  • MySQLi面向過程極速入門MySQLi面向過程極速入門
  • MySQLi面向對象編程極速入門MySQLi面向對象編程極速入門
  • MySQL優化視頻教程—布爾教育MySQL優化視頻教程—布爾教育
  • MySQL高級進階視頻教程MySQL高級進階視頻教程
  • 視頻教程分類
    3d试机号绕胆图