數據庫相關知識整理(二)

索引

索引的本質上是一個存儲列值的數據結構。如果在某列上使用了 B-樹索引,那麼這些列值在索引中是被排過序的,有序的值是索引能提高查詢性能的主要原因。

索引的優點和缺點

優點:

通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。

可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。

可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。

在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。

通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

缺點:

創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加。

索引需要佔物理空間,除了數據表佔數據空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。

添加索引原則

在查詢中很少使用或者參考的列不應該創建索引。

只有很少數據值的列也不應該增加索引。

定義爲text、image和bit數據類型的列不應該增加索引。

當修改性能遠遠大於檢索性能時,不應該創建索引。

幾種索引類型

普通索引:僅加速查詢
唯一索引:加速查詢 + 列值唯一(可以有 null)
主鍵索引:加速查詢 + 列值唯一(不可以有 null)+ 表中只有一個
組合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合併
全文索引:對文本的內容進行分詞,進行搜索

mysql索引原理

哈希索引

只有 memory (內存)存儲引擎支持哈希索引,哈希索引用索引列的值計算該值的hashCode,然後在 hashCode 相應的位置存執該值所在行數據的物理位置,因爲使用散列算法,因此訪問速度非常快,但是一個值只能對應一個 hashCode, 而且是散列的分佈方式,因此哈希索引不支持範圍查找和排序的功能。

B+樹索引

因爲磁盤IO每次讀取一個頁,B+樹每個節點大小爲一個頁,非葉節點不存儲數據,能存更多key,樹高更小,查詢更快。

BTree 索引
BTree 是平衡搜索多叉樹,設樹的度爲 d(d>1),高度爲 h,那麼 BTree 要滿足以下條件:
每個葉子結點的高度一樣,等於 h;
每個非葉子結點由 n-1 個 key 和 n 個指針 point 組成,其中 d<=n<=2d,key 和 point 相互間隔,結點兩端一定是 key;
葉子結點指針都爲 null;
非葉子結點的 key 都是[key,data]二元組,其中 key 表示作爲索引的鍵,data 爲鍵值所在行的數據

在 BTree 的機構下,就可以使用二分查找的查找方式,查找複雜度爲 h*log(n),一般來說樹的高度是很小的,一般爲 3 左右,因此 BTree 是一個非常高效的查找結構。

B+Tree 索引
B+Tree 是 BTree 的一個變種,設 d 爲樹的度數,h 爲樹的高度,B+Tree 和 BTree 的不同主要在於:
B+Tree 中的非葉子結點不存儲數據,只存儲鍵值;
B+Tree 的葉子結點沒有指針,所有鍵值都會出現在葉子結點上,且 key 存儲的鍵值對應的數據的物理地址;

一般來說 B+Tree 比 BTree 更適合實現外存的索引結構,因爲存儲引擎的設計專家巧妙的利用了外存(磁盤)的存儲結構,即磁盤的一個扇區是整數倍的 page(頁),頁是存儲中的一個單位,通常默認爲 4K,因此索引結構的節點被設計爲一個頁的大小,然後利用外存的“預讀取”原則,每次讀取的時候,把整個節點的數據讀取到內存中,然後在內存中查找,已知內存的讀取速度是外存讀取 I/O 速度的幾百倍,那麼提升查找速度的關鍵就在於儘可能少的磁盤 I/O,那麼可以知道,每個節點中的 key 個數越多,那麼樹的高度越小,需要 I/O的次數越少,因此一般來說 B+Tree 比 BTree 更快, 因爲 B+Tree 的非葉節點中不存儲 data
域 ,就可以存儲更多的 key 。
帶順序索引的 B+TREE
很多存儲引擎在 B+Tree 的基礎上進行了優化,添加了指向相鄰葉節點的指針,形成了帶有順序訪問指針的 B+Tree ,這樣做是爲了提高區間查找的效率,只要找到第一個值那麼就可以順序的查找後面的值。

在Innodb下主鍵索引是聚集索引,在Myisam下主鍵索引是非聚集索引

 

聚簇索引和非聚簇索引的區別

聚簇索引的葉子節點存放的是主鍵值和數據行,支持覆蓋索引;二級索引的葉子節點存放的是主鍵值或指向數據行的指針。

由於節子節點(數據頁)只能按照一顆B+樹排序,故一張表只能有一個聚簇索引。輔助索引的存在不影響聚簇索引中數據的組織,所以一張表可以有多個輔助索引

注: 覆蓋索引(covering index)指一個查詢語句的執行只用從索引中就能夠取得,不必從數據表中讀取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章