資料庫 資料庫索引探索

2021-07-24 08:52:24 字數 1760 閱讀 2975

資料庫的資料儲存在磁碟中,當使用者或者程式通過dbms查詢資料庫某條記錄時,就會將磁碟中對應的資料讀取到記憶體中。但是問題是,假如所查詢的表的資料量很大,而記憶體是有限的,在沒有索引的情況下,查詢將對整個表進行掃瞄,就需要多次io讀取磁碟中的資料,通過「遍歷」資料塊的方式找到需要的記錄。這個效能消耗很大,並且會很慢。

索引就是用來解決這個問題。對乙個字段新增索引,那麼會維護這個欄位的索引資料,當查詢這個關鍵字段的資料,就會將索引資料載入到記憶體中去,通過索引資料找到這個關鍵字段,而在索引中每個關鍵字段會指向對應的記錄,或者乙個桶(桶中儲存對應記錄的指標)。具體資料結構可以通過b樹、hash表實現。

具體例子:

假設資料庫中乙個表有10^6條記錄,dbms的頁面大小為4k,可以儲存100條記錄。如果沒有索引,查詢將對整個表進行掃瞄,最壞情況下,所有資料頁都不在記憶體中,需要讀取log100(10^6)=10^4個頁面,如果這些頁面在磁碟上隨機分布,需要進行10^4次i/0,假設磁碟每次i/o時間為10ms,則總共需要100s。如果對之簡歷b-tree索引,則只需要進行log100(10^6)=3次頁面讀取,最壞情況下耗時30ms。

索引是在儲存引擎中實現的。儲存引擎是指記憶體儲存、事務處理支援等不同的技術以及配套的相關功能。我的理解是,資料儲存所用的資料結構的差異,使得支援不同的技術和功能,劃分成不同的儲存引擎。下面就來**三種索引資料結構。

先來看一下b樹的定義:

一棵m階平衡樹或者為空,或者滿足以下條件:

① 每個結點至多有m棵子樹

② 根結點為葉結點,或至少有兩棵子樹

③ 每個非葉結點至少有[m/2]棵子樹

④ 從根結點到葉結點的每一條路徑都有同樣的長度,即葉結點在同一層次上

m階平衡很好地適應了記憶體有限,dbms分塊讀取資料這個特點。

看一下b+樹

一棵m階b+樹是一棵平衡樹,按下面方式組織

① 每個節點中至多有m-1個查詢鍵值k1,k2,……,km-1,m個指標p1,p2,……,pm。

② 葉結點中的指標指向所查詢的記錄

兩種情況:

a.查詢鍵恰好是主檔案的主鍵(非空、唯一),那麼葉結點中的指標直接指向主檔案中的記錄。例如指標pi指向查詢鍵值為ki的主記錄。

b. 查詢鍵不是主檔案的主鍵,並且查詢鍵值的順序也不是主檔案的順序,那麼葉結點中的指標指向乙個桶,桶中存放指向具有該查詢鍵值的主記錄的指標。

③ 非葉結點的組織方式

對於指標p跟鍵值k有,pi指向的子樹中的所有查詢鍵值均大於或等於ki-1,而均小於ki。

類似於b+樹,區別在於,b樹中的所有查詢鍵值只出現一次。

在b+樹中,每個查詢鍵值都必須在葉結點中出現,為了組織多級索引,某些查詢鍵值還必須在上層結點中出現。在b+樹中,查詢鍵值可以出現在任何節點上,但只能出現一次。

所以在b樹中,查詢鍵值如果出現在非葉結點,那麼需要在它出現的地方附加上乙個指向主記錄的指標。

雜湊方法是指根據記錄的查詢鍵值,使用乙個函式計算得到的函式值作為磁碟塊的位址,對記錄進行儲存和訪問。在資料庫技術中,一般使用「桶」作為基本的儲存單位,乙個桶可以存放多條記錄。

桶溢位解決方法

hash索引跟b樹索引乙個很大的區別是,hash索引只能進行確定值的搜尋,而不能模糊搜尋。因為hash索引搜尋是通過得到關鍵值的hash方法值,來得到記錄的位址,所以也不能通過hash索引進行排序。

所以,是否建立索引需要根據具體需要,權衡索引的利弊來使用索引。

參考資料

《資料庫系統教程》 施伯樂等著 高等教育出版社

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...

資料庫(3)資料庫索引

這一段時間一直在學習關係型資料庫,準備寫乙個小專題來總結一下這一段時間的學習結果。1.2 從索引的底層資料結構來看 b 樹索引和hash索引 1.2 從索引的建立方式 主鍵索引,唯一索引,普通索引,組合索引和全文索引 二.查詢時會使用索引的情況 三.查詢時不會使用索引的情況 四.推薦建立索引的列 五...

資料庫 資料庫索引原理

正確的建立合適的索引 是提公升資料庫查詢效能的基礎 4.b tree 在兩大引擎中的體現 5.索引的原則 索引是為了加速對錶中資料行的檢索而建立的一種分散儲存的資料結構。索引能極大的減少儲存引擎需要掃瞄的資料量 索引可以把隨機io變成順序io 索引可以幫助我們在進行分組 排序等操作時,避免使 用臨時...