B樹索引 hash索引

2021-09-14 01:02:59 字數 1618 閱讀 4435

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。

對於乙個表中幾百萬行資料來說,如果不使用索引,每次查詢都需要遍歷一遍所有的行,從而找到所需要的資料,平均查詢效率o(n)。如果使用了索引,在查詢時會先找索引,快速定位到磁碟位置,然後再去讀出該行的資料,效率大大提公升。

建立索引的規則:

1、利用最左字首:mysql會一直向右查詢直到遇到範圍操作(>,<,like、between)就停止匹配。

2、不能過度索引:在修改表內容的時候,索引必須更新或者重構,所以索引過多時,會消耗更多的時間。

3、盡量擴充套件索引而不要新建索引

4、最適合的索引的列是出現在where子句中的列或連線子句中指定的列。

5、不同值較少的列不必要建立索引(性別)。

首先,b-樹是一種多路搜尋樹(並不一定是二叉的),它是一種平衡的多叉樹,稱為b樹(或b-樹、b_樹)。

b樹索引:

更準確的說應該是b+樹,由於建立索引語句使用的關鍵字為btree,所以一般都叫做b樹索引。

首先為了查詢速度,索引肯定要使用便於查詢的資料結構。 不使用紅黑樹最主要的原因是為了減少隨機磁碟i/o的次數。b樹就是專門用在磁碟上的資料結構:對於相同的資料量,b樹的深度更低,經過的節點更少,所以造成的隨機磁碟io次數也就更少。

b+ 樹是一種樹資料結構,是乙個n叉樹,每個節點通常有多個孩子,一棵b+樹包含根節點、內部節點和葉子節點。根節點可能是乙個葉子節點,也可能是乙個包含兩個或兩個以上孩子節點的節點。

b+樹是b樹的變體,它的完整資料全部儲存在葉子結點,非葉子節點只儲存key值,這樣b+樹避免了不必要的磁碟i/o,由於所有的查詢最終都會到葉子結點,所以也就保證了查詢效能的穩定。

同時由於b+樹葉子結點使用指標串聯起來,這就方便了範圍查詢。

而且由於b+樹索引本身的有序性,所以在很多情況下可以避免對資料的排序。

btree索引中的最左匹配原則:

btree是按照從左到右的順序來建立搜尋樹的。比如索引是(name,age,***),會先檢查name欄位,如果name欄位相同再去檢查後兩個字段。

所以當傳進來的是後兩個欄位的資料(age,***),因為建立搜尋樹的時候是按照第乙個字段建立的,所以必須根據name欄位才能知道下乙個欄位去**查詢。

所以傳進來的是(name,***)時,首先會根據name指定搜尋方向,但是第二個字段缺失,所以將name欄位正確的都找到後,然後才會去匹配***的資料。

hash在很多程式語言中都能見到,因為它查詢速度非常快,理論上平均時間複雜度能達到o(1)。

和b樹索引相比,hash索引在使用上有很大的侷限性:

1.無序性,導致無法範圍查詢和索引排序。

2.對完整的key計算hash,所以不支援部分匹配。

比如對多個列建立hash索引,查詢時條件必須這些列精確匹配,才能使用到hash索引。

3.由於hash索引實際只儲存了資料對應的行指標,所以不能避免讀取資料行。

4.當產生hash碰撞的時候,資料庫要遍歷拉鍊中所有的行指標,逐個取出資料行進行比較,資料量越大,衝突越多,查詢代價越高。

由於hash索引的上述缺點,所以實際使用hash索引的情況很少,mysql除了memory儲存引擎和ndb分布式儲存引擎,其他大部分儲存引擎預設使用b樹索引。

Hash索引和B 樹索引的區別

我們都知道在mysql中索引的資料結構有兩種,一種是hash,另一種是btree。在資料表中建立什麼樣的索引需要我們根據實際情況進行選擇。b 樹結構示意圖 b 樹的特徵 1 有k個孩子的節點就有k個關鍵字。也就是孩子數量 關鍵字數。2 非葉子節點的關鍵字也會同時存在在子節點中,並且是在子節點中所有關...

hash索引和B 索引區別

hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引的查詢效率要遠高於 b tree 索引。可 能很多人又有疑問了,既然 hash 索引的效率要比 b tree 高很多,為什麼大...

索引有B 索引和hash索引,各自的區別

hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b 樹索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,那為什麼大家不都用hash索引而還要使用b 樹索引呢?1.hash索引僅僅能滿足 in 和 查詢,不能使用範圍查詢。因為經過相應的hash演算法處理之後的h...