資料庫 索引及其原理 面試常考點

2021-10-09 05:48:30 字數 3462 閱讀 3183

2.b+

三、總結

索引(index)是幫助mysql高效獲取資料的資料結構。可以得到索引的本質:索引是資料結構。可以理解為「排好序的快速查詢資料結構」,在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引。

mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。

打個比方,如果合理的設計且使用索引的mysql是一輛法拉利的話,那麼沒有設計和使用索引的mysql就是一輛自行車。

建立索引時,你需要確保該索引是應用在 sql 查詢語句的條件(一般作為 where 子句的條件)。

索引有兩種資料結構:hash和b+

我們在設計索引的時候,會發現索引型別是可以選擇的。

關於雜湊的簡介可檢視上節講解:雜湊及雜湊衝突

注意字段值所對應的陣列下標是雜湊演算法隨機算出來的,所以可能出現雜湊衝突。

那麼對於這樣乙個索引結構,現在來執行下面的sql語句:

select * from sanguo where name=

'雞蛋'

select * from sanguo where name>

'雞蛋'

則無能為力,因為雜湊表的特點就是可以快速的精確查詢,但是不支援範圍查詢。如果做成了索引,那速度也是很慢的,要全部掃瞄。

hash缺陷及應用場景

缺陷:有序的適合靜態資料,因為如果我們新增、刪除、修改資料的時候就會改變他的結構。比如你新增乙個,那在你新增的位置後面所有的節點都會後移,成本很高。

應用場景:等值查詢的場景,就只有kv(key,value)的情況,例如redis、memcached等這些nosql的中介軟體,較為適合於做靜態資料儲存引擎,用來儲存靜態資料,例如,2023年某銀行的使用者訪問款記錄等等。

什麼是b樹?

b樹原理:

b+ 樹是一種資料結構,一種查詢樹,我們知道,這一類樹(比如二叉查詢樹,紅黑樹等等)最初生成的目的都是為了解決某種系統中,查詢效率低的問題。b樹也是如此,它最初啟發於二叉查詢樹,二叉查詢樹的特點是每個非葉節點都只有兩個孩子節點。然而這種做法會導致當資料量非常大時,二叉查詢樹的深度過深,搜尋演算法自根節點向下搜尋時,需要訪問的節點也就變的相當多。如果這些節點儲存在外儲存器中,每訪問乙個節點,相當於就是進行了一次i/o操作,隨著樹高度的增加,頻繁的i/o操作一定會降低查詢的效率

這裡有乙個基本的概念,就是說我們從外儲存器中讀取資訊的步驟,簡單來分,大致有兩步:

綜上,對於外儲存器的資訊讀取最大的時間消耗在於尋找磁碟頁面。那麼乙個基本的想法就是能不能減少這種讀取的次數,在乙個磁碟頁面上,多儲存一些索引資訊。b樹的基本邏輯就是這個思路,它要改二叉為多叉,每個節點儲存更多的指標資訊,以降低i/o運算元。

乙個m階的b樹具有如下幾個特徵:

1.根結點至少有兩個子女。

2.每個中間節點都包含k-1個元素和k個孩子,其中 m/2 <= k <= m

3.每乙個葉子節點都包含k-1個元素,其中 m/2 <= k <= m

4.所有的葉子結點都位於同一層。

5.每個節點中的元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域分劃。

乙個標準的b樹如下:

什麼是b+樹?

b+樹是b樹的一種變形,它更適合實際應用中作業系統的檔案索引和資料庫索引;

乙個m階的b+樹具有如下幾個特徵:

1.有k個子樹的中間節點包含有k個元素(b樹中是k-1個元素),每個元素不儲存資料,只用來索引,所有資料都儲存在葉子節點。

2.所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序鏈結。

3.所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。

一棵標準的b+樹如下:

b樹和b+樹的區別?

b+樹和b樹相比,主要的不同點在以下3項:

b+樹的相對於b樹的優勢?

根據b+樹的結構,我們可以發現b+樹相比於b樹,在檔案系統,資料庫系統當中,更有優勢,原因如下:

b+樹的磁碟讀寫代價更低

b+樹的內部結點並沒有指向關鍵字具體資訊的指標。因此其內部結點相對b樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查詢的關鍵字也就越多。相對來說i/o讀寫次數也就降低了。

b+樹的查詢效率更加穩定

由於內部結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查詢必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每乙個資料的查詢效率相當。

b+樹更有利於對資料庫的掃瞄範圍

b樹在提高了磁碟io效能的同時並沒有解決元素遍歷的效率低下的問題,而b+樹只需要遍歷葉子節點就可以解決對全部關鍵字資訊的掃瞄,所以對於資料庫中頻繁使用的range query,b+樹有著更高的效能。

①通過建立索引,可以在查詢的過程中,提高系統的效能

②通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性

③在使用分組和排序子句進行資料檢索時,可以減少查詢中分組和排序的時間

①建立索引和維護索引要耗費時間,而且時間隨著資料量的增加而增大

②索引需要占用物理空間,如果要建立聚簇索引,所需要的空間會更大

③在對錶中的資料進行增加刪除和修改時需要耗費較多的時間,因為索引也要動態地維護

①經常需要搜尋的列上

②作為主鍵的列上

③經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度

④經常需要根據範圍進行搜尋的列上

⑤經常需要排序的列上

⑥經常使用在where子句上面的列上

①查詢中很少用到的列

②對於那些具有很少資料值的列.比如人事表的性別列,bit資料型別的列

③對於那些定義為text,image的列.因為這些列的資料量相當大

④當對修改效能的要求遠遠大於搜尋效能時.因為當增加索引時,會提高搜尋效能,但是會降低修改效能

mysql選用b+樹這種資料結構作為索引,可以提高查詢索引時的磁碟io效率,並且可以提高範圍查詢的效率,並且b+樹里的元素也是有序的。

資料庫索引及其工作原理

我們通過乙個簡單的例子來開始教程,解釋為什麼我們需要資料庫索引。假設我們有乙個資料庫表 employee,這個表有三個字段 列 分別是 employee name employee age 和employee address。假設表employee 有上千行資料。現在假設我們要從這個表中查詢出所有名...

資料庫 資料庫索引原理

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

資料庫原理 索引

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