1. 程式人生 > >MySQL之Innodb儲存引擎:索引

MySQL之Innodb儲存引擎:索引

1,Innodb儲存引擎索引的使用的B+樹索引本身並不能找到具體的一條記錄,能找到只是該記錄所在的頁。然後資料庫通過把頁讀入到記憶體,再在記憶體中進行查詢,最後得到要查詢的資料。

B+樹的葉子節點是資料頁。頁中有多條記錄。

2、B+樹特點:所有記錄節點都是按鍵值的大小順序存放在同一層的葉子節點,由各葉子節點指標進行連線。

3、B+樹索引分為聚集索引和輔助索引,兩者不同的是,葉子節點存放的是否是真實資訊資料。

    聚集索引就是按照每張表的主鍵構造成一棵B+樹,同時葉子節點中存放的即為整張表的行記錄資料,聚集索引的葉子節點也稱為資料頁。這就是為什麼一張表只能有一個聚集索引。資料頁之間用雙向連結串列連線。聚集索引在並不是物理儲存連續的。

    輔助索引(非聚集索引)葉子節點並不包含行記錄的全部資料。葉子節點除了包含鍵值以外,還包含對應行資料的聚集索引鍵。當通過輔助索引來查詢資料時,儲存引擎會遍歷輔助索引並通過葉子指標獲得指向聚集索引的主鍵值,通過主鍵索引來找到一個完整的行資訊。因為多個輔助索引不會影響資料在聚集索引上的組織,每張表上可以有多個輔助索引。

4、什麼情況下新增索引?對於某個欄位取值範圍比較大,選擇性大時,加索引有意義。

5、其他幾種索引型別

    聯合索引:表上多個列進行索引。聯合索引也是一顆B+樹,不一樣的是聯合索引的鍵值的數量大於1.

對於聯合索引(a,b),where a =xxx and b =xxx,和where a=xxx 可以使用此聯合索引,但是對於where b = xxx不能使用,因為b列資料在此聯合索引上不是有序的。

    覆蓋索引:即可以從輔助索引中查到記錄,則沒有必要再查詢聚集索引中的記錄。好處是輔助索引遠小於聚集索引的大小,查詢較快。

6、優化器選擇不使用索引的情況:如果要訪問的資料量蠻大時(大於20%),如果某列即時有輔助索引,也不會使用,而是直接使用聚集索引(即全表掃描),因為順序讀遠大於離散讀。

參考:

姜承堯《MySQL技術內幕:InnoDB儲存引擎》