密集索引和係數索引的區別

  • 密集索引文件中的每一個搜索碼值都對應一個索引值
  • 係數索引文件只爲索引碼的某些值建立索引

密集索引決定了表的物理排列順序,一個表只能有一個物理排列順序,所以一個表只能創建一個密集索引
在這裏插入圖片描述

以mysql爲例,有myisam存儲引擎爲稀疏索引,innodb存儲引擎爲密集索引。
MyIsam
不管是主鍵索引,唯一鍵索引或者普通索引,都屬於稀疏索引
InnoDB

  • 若一個主鍵被定義,該主鍵則作爲密集索引
  • 若沒有主鍵被定義,該表的第一個唯一非空索引則作爲密集索引
  • 若不滿足以上條件,innodb內部會生成一個隱藏主鍵(密集索引)。這個隱藏的主鍵是一個6字節的列,該列的值會隨着數據的插入自增。也就是說innodb必須有一個主鍵,而該主鍵必須作爲唯一的密集索引而存在。
  • 非主鍵索引存儲相關鍵位和其對應的主鍵值,包含兩次查找
    在這裏插入圖片描述
    密集索引中,索引和數據在一個文件中,所以在檢索的時候,在加載葉子節點的主鍵進入內存的同時,也加載了對應的數據,即若使用了where id = '14'這樣的條件查詢主鍵,則按照b+tree的查找算法,即可查找到對應的葉子節點,並獲得對應行的數據

若對輔助鍵索引進行條件篩選,則要經過兩個步驟,第一步,在稀疏索引的b+tree中,檢索該鍵,獲取主鍵信息。第二步,使用主鍵where id = ‘14’,在b+tree中再執行一次b+tree的檢索操作,最終到達葉子節點獲取行數據

稀疏索引
在這裏插入圖片描述
稀疏索引中,節點的結構完全一致,只是存儲的內容不一樣,主鍵索引的B+tree中存儲主鍵,輔助鍵索引中存儲輔助鍵。這兩個B+tree的葉子節點都指向同一個地址指向真正的表數據。對於表數據來說,這兩個鍵沒有任何差別,由於索引樹是獨立的,通過輔助鍵檢索無需訪問主鍵索引樹。

同樣還以MyIsam和InnoDb爲例,以InnoDB爲引擎創建的表會在磁盤上創建兩個文件.frm.idb,而MyIsam創建三個文件.frm.myi.myd
InnoDb
.frm存儲表結構
.idb文件存儲索引和表數據。
MyIsam的索引和數據是分開的
.frm存放表結構
.myi存放索引
.myd存放數據

發佈了69 篇原創文章 · 獲贊 18 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章