1. 程式人生 > >密集索引和稀疏索引的區別

密集索引和稀疏索引的區別

ima class 結構 表數 bdd com 定義 mage copyright

密集索引和稀疏索引的區別

a)密集索引文件中的每個搜索碼值都對應一個索引值,其葉子節點保存不僅僅是鍵值,還保存了位於同一行記錄裏的其他列的信息,由於密集索引決定了表的物理排列順序,一個表只能有一個物理排列順序,所以一個表只能創建一個密集索引。

b)稀疏索引文件只為索引碼的某些值建立索引項,其葉子節點僅保存了鍵位信息以及該行數據的地址或者主鍵。

技術分享圖片

咱們來對MySql做具體分析,mysql主流的兩種存儲引擎,一種是MyISAM,另外一種是Inodb,前者不管是主鍵索引,唯一鍵索引或者普通索引,其索引均屬於稀疏索引,而InnoDB必須有且只有一個密集索引:

a) 若一個主鍵被定義,該主鍵則作為密集索引

b) 若沒有主鍵被定義,該表的第一個唯一非空索引則作為密集索引

c) 若不滿足以上條件,InnoDB內部會生成一個隱藏主鍵(密集索引)

d) 非主鍵索引存儲相關鍵位和其對應的主鍵值,包含兩次查找

技術分享圖片

如上圖,InnoDB使用的是密集索引,將主鍵組織到一顆B+Tree中,而行數據就存在葉子節點上,因為InnoDB的主鍵索引和對應的數據是保存在同一個文件當中的,所以檢索的時候在加載葉子節點的主鍵進入內存的同時,也加載了對應的數據,即若使用 where id = 14 這樣的條件查詢主鍵,則按照B+Tree的檢索算法即可查找到對應的葉子節點並獲得對應的行數據;若對稀疏索引進行條件篩選,則需要經過兩個步驟,第一步在稀疏索引的B+Tree中檢索該鍵,對應到主鍵信息,第二步是根據找到的主鍵信息在B+Tree中再執行一遍B+Tree的索引操作,最終再到達葉子節點獲取整行的數據。

MyISAM使用的均為稀疏索引,其主鍵索引和其他輔助鍵索引的兩顆樹看上去沒什麽不同,節點的結構完全一致,只是存儲的內容不一樣而已,主鍵索引B+Tree的節點存儲了主鍵, 輔助鍵索引B+Tree的節點存儲了輔助鍵,表數據存儲在獨立的地方,也就是索引和數據是分開存儲的,這兩類索引的B+Tree葉子節點都使用地址指向真正的表數據,對於表數據來說,這兩類鍵沒有任何的差別。

更多內容請掃描二維碼關註“碼農TT”

技術分享圖片

密集索引和稀疏索引的區別