資料庫索引的原理

2021-09-26 02:04:31 字數 2096 閱讀 2998

我們從盤古開天闢地講起

1、首先資料庫中的資料是以什麼樣的形式儲存在我們的裝置中呢?

乙個表是由幾個欄位的資料組成,雖然我們看上去這些資料都有序地、「一行一行地」存在表中。但是事實上,物理儲存中的這些資料可能分散在不同的資料塊中。比如(id=1, name='martin',age=22,***=1),要找到martin這個人的資訊,在查詢的時候先找到第乙個資料(id=1)所在的資料庫位址,然後在這個資料的底端找到下乙個資料塊的位址(name='martin'的位址),類似於鍊錶的結構。如果我們查詢的資料量比較大,顯然這種方法是不合適的。所以出現了索引,索引是對錶中的字段在另開闢的空間中建立一種新的資料結構(b/b+樹,有的資料庫也用雜湊桶)儲存這些值,對這些值進行排序,每個值又指向其相關的值。沒有索引的情況下,資料可能一整塊一整塊地儲存在磁碟上;但是加了索引之後,表在磁碟上的儲存結構就由整齊排列的結構轉變為樹狀結構。

2、再講講b樹和b+樹

我們都知道二叉樹這個可以將查詢範圍每次縮小1/2的資料結構。儘管這個效率已經非常可觀,我們為什麼還要用b樹和b+樹作為資料庫索引的儲存結構呢?我們上邊說到,在沒有索引的情況下資料庫中的資料可能一塊一塊地儲存在硬碟上,而硬碟是順序訪問裝置,硬碟中需要磁頭先定位再訪問,這就造成了就近讀取速度快一些。二叉樹在滿的情況下,每個節點僅有兩個孩子節點,這就容易造成節點兩端的深度不一致,可能某一端資料比較多,比較深。而我們查詢時需要先通過io操作將資料載入到記憶體中,而資料不能一次性全部載入到記憶體中,只能逐一載入每個磁碟頁(對應樹的乙個節點),二叉樹深度過大就會造成磁碟io操作頻繁效率低下,而b樹和b+樹這類平衡樹能保證節點兩邊樹的深度相同,並且每個節點能儲存多個元素,降低了深度,也就減少了io操作。

(ps:1、mysql底層是b+樹,oracle是b樹,其他也有一些資料庫使用是雜湊桶。2、磁碟適合b樹結構儲存,記憶體適合hash儲存,因為記憶體是隨機訪問隨機儲存的儲存裝置,不需要磁頭定位)

3、索引具體儲存了啥?

上面說過索引是對錶中的某些欄位在另開闢的空間中建立的一種新的資料結構。那麼索引有哪些資料組成呢?一條索引中包含的基本資訊包括鍵值(即你定義索引時指定的所有欄位的值)+邏輯指標(指向資料頁或者另一索引頁,索引頁就是儲存索引的空間)。索引頁中的資料量比真實資料小許多,也密集許多,所以在索引中查詢時在io上佔很大優勢。

b樹的非葉子節點對應了索引頁,葉子節點對應了資料頁。

4、索引有哪些型別?

索引分為聚集索引非聚集索引。比方說我們經常給表的id欄位加上主鍵,主鍵就是乙個聚集索引(當然,建立主鍵的時候可以宣告為非聚集索引。主鍵必須依賴於索引,伴隨這所以的主鍵不能刪除,除非同時刪除主鍵。乙個表也只能有乙個聚集索引,因為真實資料的物理儲存只可能是一種;如果一張表沒有索引,那麼它被稱為堆集,這樣的表中資料行沒有特定的順序,所有的的新行都將被新增到末尾位置),它將整個表變成了乙個索引,表中的所有資料就以平衡樹的形式儲存,所以乙個表只能有乙個主鍵。舉個例子,有一萬條資料,在沒有主鍵索引之前,最壞的情況可能需要一萬次io操作、匹配才能查到結果,但是在b樹的情況下,只需要匹配樹的深度次數即可。當然,索引也有***。索引讓查詢速度上公升,但是會讓寫入速度下降,因為平衡多叉樹必須實時維持乙個正確的姿態,增刪改都會影響這棵樹各節點的內容,破壞樹的結構。因此在每此改變資料時,樹的結構就需要改變,這個開銷不可避免。

而非聚集索引就是我們平時提起和使用的常規索引,也是採用平衡樹作為索引的資料結構。每新建乙個索引就會將表中的資料拷貝乙份(對於主鍵這個聚集索引,索引和表資料是一起儲存的,並不會單獨拷貝乙份作為索引資料,不然也太蠢了),比方說我們給name欄位加上索引,那麼這個索引僅有name欄位的值構成。

聚集索引和非聚集索引的區別在於:1、聚集索引表資料按照索引的順序儲存,葉子節點儲存了真實的資料行,不再有另外單獨的資料頁;而非聚集索引表資料儲存順序與索引順序無關,葉節點包含了索引的字段值以及指向資料頁資料行的邏輯指標。2、通過聚集索引可以查詢到我們需要查詢的資料,而通過非聚集索引可以查詢到記錄對應的主鍵值,再通過主鍵值來定位資料。可以這麼說:主鍵是通往真是資料的唯一途徑。但是有一種情況不需要通過主鍵定位,就是覆蓋索引。比方說我們給name和age加上索引,那麼執行select age from table where name = 'martin'的時候,由於age也在索引中,所以不需要再通過主鍵來定位了。

參考部落格

資料庫 資料庫索引原理

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

資料庫原理 索引

一 索引的概念 索引就是加快檢索表中資料的方法。資料庫的索引類似於書籍的索引。在書籍中,索引允許使用者不必翻閱完整個書就能迅速地找到所需要的資訊。在資料庫中,索引也允許資料庫程式迅速地找到表中的資料,而不必掃瞄整個資料庫。二 索引的特點 1.索引可以加快資料庫的檢索速度 2.索引降低了資料庫插入 修...

資料庫索引原理

說白了,索引問題就是乙個查詢問題。資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。索引的實現通常使用b樹及其變種b 樹。在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算...