mysql預設支援兩種型別的索引:
hash索引和b+樹索引:
那為什麼不使用其他的資料結構作為索引?
hash索引:雜湊表的特點就是可以快速的精確查詢,但是不支援範圍查詢。如果做成了索引,那速度也是很慢的,要全部掃瞄。
平衡二叉樹:
1、索引也不只是在記憶體裡面儲存的,還是要落盤持久化的,如果資料多了,樹高會很高,查詢的成本就會隨著樹高的增加而增加。如果採用的是機械硬碟,效率就會更低。
2、我們磁碟讀取資料是按照磁碟塊來讀取的,所以我們需要把資料盡量多的放在磁碟塊中;二叉樹乙個節點只能儲存乙個資料,即乙個磁碟塊只儲存乙個鍵值對,所以不採用二叉樹的模型。
為什麼我們使用b+樹而不使用b樹呢?
首先我們來看看b樹和b+樹的結構區別;
b樹:
一顆m階b樹的定義如下:
1)每個結點最多有m-1個關鍵字。
2)根結點最少可以只有1個關鍵字。
3)非根結點至少有math.ceil(m/2)-1個關鍵字。
4)每個結點中的關鍵字都按照從小到大的順序排列,每個關鍵字的左子樹中的所有關鍵字都小於它,而右子樹中的所有關鍵字都大於它。
5)所有葉子結點都位於同一層,或者說根結點到每個葉子結點的長度都相同
在資料庫中我們將b樹(和b+樹)作為索引結構,可以加快查詢速速,此時b樹中的key就表示鍵,而data表示了這個鍵對應的條目在硬碟上的邏輯位址。b樹相比於二叉樹而言,每個節點可以儲存多個指標指向資料;故而可以減少磁碟i/o次數來提高查詢效率。
b+樹:
一顆m階b+樹的定義如下:
1)b+樹包含2種型別的結點:內部結點(也稱索引結點)和葉子結點。根結點本身即可以是內部結點,也可以是葉子結點。根結點的關鍵字個數最少可以只有1個。
2)b+樹與b樹最大的不同是內部結點不儲存資料,只用於索引,所有資料(或者說記錄)都儲存在葉子結點中。
3) m階b+樹表示了內部結點最多有m-1個關鍵字(或者說內部結點最多有m個子樹),階數m同時限制了葉子結點最多儲存m-1個記錄。
4)內部結點中的key都按照從小到大的順序排列,對於內部結點中的乙個key,左樹中的所有key都小於它,右子樹中的key都大於等於它。葉子結點中的記錄也按照key的大小排列。
5)每個葉子結點都存有相鄰葉子結點的指標,葉子結點本身依關鍵字的大小自小而大順序鏈結
b+樹相比於b樹而言:
1、b+樹的資料只儲存在葉子節點中而非葉子節點只儲存索引資料;我們知道索引本身也是很大的,需要以索引檔案的形式儲存在磁碟上,這樣在索引查詢的過程中可以減少磁碟 i/o的次數。
2、
因為 b+ 樹索引的所有資料均儲存在葉子節點,而且資料是按照順序排列的。那麼 b+ 樹使得範圍查詢,排序查詢,分組查詢以及去重查詢變得異常簡單。而 b 樹因為資料分散在各個節點,要實現這一點是很不容易的。
mysql索引的選擇 MySQL索引的選擇
hash索引和b 樹索引 那為什麼不使用其他的資料結構作為索引?hash索引 雜湊表的特點就是可以快速的精確查詢,但是不支援範圍查詢。如果做成了索引,那速度也是很慢的,要全部掃瞄。平衡二叉樹 1 索引也不只是在記憶體裡面儲存的,還是要落盤持久化的,如果資料多了,樹高會很高,查詢的成本就會隨著樹高的增...
mysql 選擇索引 mysql選擇索引
1 盡量為用來搜尋 分類或分組的資料列編制索引,不要為作為輸出顯示的資料列編制索引。最適合有索引的資料列是那些在where子句中資料列,在聯結子句 現的資料列,或者是在group by order by子句 現的資料列。select 後的資料列最好不要用索引。2 綜合考慮各資料列的維度。資料列的維度...
mysql索引的選擇 Mysql索引選擇邏輯
索引選擇邏輯 優化器選擇索引的目的,是找到乙個最優的執行方案,並用最小的代價去執行語句。在資料庫裡面,掃瞄行數是影響執行代價的因素之一。掃瞄的行數越少,意味著訪問磁碟資料的次數越少,消耗的 cpu 資源越少 掃瞄行數是怎麼判斷的?mysql 在真正開始執行語句之前,並不能精確地知道滿足這個條件的記錄...