首先先來了解下什麼是索引項 索引值 搜尋碼
索引項包括索引值以及指向該搜尋碼值的第一條資料記錄的指標。
從上圖中可以看出:
(一)、密集索引檔案中的每乙個搜尋碼值都對應著乙個索引值 這就可以理解為葉子結點不但需要儲存鍵值 還儲存位於同一行記錄的其他列資訊。由於密集索引決定了表的物理排列順序,乙個表只有乙個物理排列順序,所以乙個表只能建立乙個密集索引。
(二)、稀疏索引檔案中只為搜尋碼的某些值建立索引項 這可以理解為葉子結點只儲存了鍵位資訊以及該行資料的位址,有的稀疏索引只儲存了鍵位資訊主鍵
說完不同 來說一下優缺點吧
a 稀疏索引占用的索引儲存空間比較小,但是查詢時間較長;
b 稠密索引查詢時間較短,索引儲存空間較大。
myisam
在myisam中 不管是主鍵索引 唯一鍵索引 普通索引 其索引都屬於稀疏索引
innodb
在innodb中 有且僅有乙個密集索引
innodb中選取規則:
(1)、如果乙個主鍵被定義了 則該主鍵作為密集索引
(2)、若該主鍵沒有被定義 則該錶的第乙個唯一非空索引作為密集索引
(3)、若不滿足上述條件 則innodb內部會生成乙個隱藏主鍵(密集索引)
(4)、非主鍵索引儲存相關鍵位和其對應的主鍵值 包含兩次查詢
了解完innodb和myisam這兩個引擎後 來個例項看看
首先 先說innodb使用的是密集索引 將主鍵組織到一棵b+樹中 而行資料就儲存在葉子結點上 因為innodb的主鍵索引和對應的資料是儲存在同乙個檔案中的 所以檢索的時候在夾雜葉子結點的元件進入記憶體的同時也載入了對應的資料 如果查詢id=7的主鍵 可利用b+樹的演算法即可查詢到對應的葉子結點以及行資料。
但如果使用稀疏索引進行條件篩選 則需要兩個步驟 在稀疏索引的b+樹中檢索該鍵 獲取到主鍵資訊 在主鍵索引的b+樹中再執行一遍檢索操作 最終再到達葉子結點 獲取對應的資料。
看完例項後 看具體資料庫使用不同的引擎會建立什麼檔案吧
1.建立乙個myisam引擎的資料表 test1 會建立三個檔案
test1.frm 儲存表的結構資訊
test1.myi 儲存表的索引資訊
test1.myd 儲存表的資料
2.建立乙個innodb引擎的資料表 test2 會建立兩個檔案
test2.frm 儲存表的結構資訊
test2.ibd 儲存表的資料和索引
不同之處很容易就看出來了吧 這裡就不多說了
密集索引和稀疏索引的區別
密集索引檔案中每乙個搜尋碼值都對應乙個索引值,就是葉子節點儲存的不只是鍵值,還儲存了位於同一行記錄裡的其他列的資訊,由於密集索引決定了表的物理排列順序,乙個表只有乙個物理排列順序,所以乙個表只能建立乙個密集索引 稀疏索引檔案只為索引碼的某些值建立索引項,比如 innodb的其他索引只存了鍵位資訊和主...
索引4 密集索引與稀疏索引
u密集索引與稀疏索引區別 秘籍索引檔案中的每個搜尋碼值都對應乙個索引值 稀疏索引檔案只為索引碼的某些值建立索引項 密集索引的定義 葉子節點儲存的不只是鍵值,還儲存了位於同一行記錄裡的其他列的資訊,由於密集索引決定了表的物理排列順序,乙個表只有乙個物理排列順序,所以乙個表只能建立乙個密集索引 稀疏索引...
mysql 稀疏 稀疏索引和稠密索引你了解嗎?
背景 最近參加了乙個面試,面試官先問了mysql的資料庫的索引的底層資料介面,我回答了 平時都用的是innodb引擎,所以其底層的索引資料型別是b 樹。面試官問我用沒用過稀疏索引。當時就懵了,聚集索引,非聚集索引,主鍵索引,覆蓋索引等等,我也沒聽過什麼是稀疏索引。我反問了一下 面試官這個索引型別是m...