- 密集索引文件中的每一個搜索碼值都對應一個索引值
- 係數索引文件只爲索引碼的某些值建立索引
密集索引決定了表的物理排列順序,一個表只能有一個物理排列順序,所以一個表只能創建一個密集索引
以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
存放數據