簡單分析下密集索引和稀疏索引的區別

一、首先 先看一下密集索引和稀疏索引的圖片 看圖片來實際瞭解一下

在這裏插入圖片描述首先先來了解下什麼是索引項 索引值 搜索碼

索引項包括索引值以及指向該搜索碼值的第一條數據記錄的指針。

從上圖中可以看出:
(一)、密集索引文件中的每一個搜索碼值都對應着一個索引值 這就可以理解爲葉子結點不但需要保存鍵值 還保存位於同一行記錄的其他列信息。由於密集索引決定了表的物理排列順序,一個表只有一個物理排列順序,所以一個表只能創建一個密集索引。
(二)、稀疏索引文件中只爲搜索碼的某些值建立索引項 這可以理解爲葉子結點只保存了鍵位信息以及該行數據的地址,有的稀疏索引只保存了鍵位信息主鍵

說完不同 來說一下優缺點吧

a  稀疏索引佔用的索引存儲空間比較小,但是查找時間較長;
b  稠密索引查找時間較短,索引存儲空間較大。

二、MySql兩種存儲引擎

  1. MyISAM
在MyISAM中 不管是主鍵索引 唯一鍵索引 普通索引 其索引都屬於稀疏索引
  1. 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 存儲表的數據和索引
不同之處很容易就看出來了吧 這裏就不多說了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章