1. 程式人生 > 其它 >MySQL的B+樹索引和hash索引的區別

MySQL的B+樹索引和hash索引的區別

簡述一下索引:

索引是資料庫表中一列或多列的值進行排序的一種資料結構;索引分為聚集索引和非聚集索引,聚集索引查詢類似書的目錄,快速定位查詢的資料,非聚集索引查詢一般需要再次回表查詢一次,如果不使用索引就會進行全表掃描;還有可以進行多欄位組成聯合索引,但是要符合最左匹配原則要求。

如果使用覆蓋索引就可以不回表掃描。
索引型別:InnoDB引擎,預設B+樹(O(logN))、Hash索引 B樹索引 O(1)

1、由於底層是使用hash表,以key-value儲存,無法直接通過索引查詢,只選擇一個數據hash索引更快,但是如果選擇N條資料,hash索引的時間複雜度是O(N),由於B+樹索引有序,且葉子節點有連結串列連線,查詢效率比hash索引快
2、索引在硬碟儲存,一般不會一次性儲存到記憶體中,B+樹可以設計允許資料分批載入,同時樹的高度較低,查詢速率較快
3、硬碟的I/O速度相比記憶體來說非常慢,而索引是用於加快查詢速度的,需要減少I/O操作,記憶體和磁碟以頁為單位交換資料,為了減少I/O,索引在新建節點的時候,是直接申請一個頁的空間,儲存分配是按頁對齊,就實現了一個節點一次I/O。
4、B+ 樹是平衡樹,它查詢任意節點所耗費的時間都是完全相同的,比較的次數就是 B+ 樹的高度

B+ Tree索引和Hash索引區別?

雜湊索引適合等值查詢,但是無法進行範圍查詢 和模糊查詢
雜湊索引沒辦法利用索引完成排序
雜湊索引不支援多列聯合索引的最左匹配規則
如果有大量重複鍵值的情況下,雜湊索引的效率會很低,因為存在雜湊碰撞問題

索引的種類有哪些?分別的特點是什麼?

普通索引:加速查詢
唯一索引:加速查詢 + 列值唯一 + 可以為null
主鍵索引:加速查詢 + 列值唯一 + 不可為null + 表中只有一個
組合索引:多列值組成一個索引,專用於組合搜尋,效率大於索引合併
全文索引:對文字的內容進行分詞,進行搜尋

不適合作為索引

更新頻繁的欄位不適合建立索引
不會出現在where子句中的欄位

聚簇索引和非聚簇索引的區別

  1. 在 InnoDB 裡,索引B+ Tree的葉子節點儲存了整行資料的是主鍵索引,也被稱之為聚簇索引。而索引B+ Tree的葉子節點儲存了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引**
  1. 聚簇索引查詢會更快,因為主鍵索引樹的葉子節點直接就是我們要查詢的整行資料了。而非主鍵索引的葉子節點是主鍵的值,查到主鍵的值以後,還需要再通過主鍵的值再進行一次查詢。通過覆蓋索引也可以只查詢一次。**
  2. 覆蓋索引(covering index)指一個查詢語句的執行只用從索引中就能夠取得,不必從資料表中讀取。也可以稱之為實現了索引覆蓋。**
  3. 當一條查詢語句符合覆蓋索引條件時,MySQL只需要通過索引就可以返回查詢所需要的資料,這樣避免了查到索引後再返回表操作,減少I/O提高效率。**

聯合索引、最左字首匹配

建立聯合索引時,會選擇識別度最高的放在最左邊,由於mysql遵循最左字首匹配原則,從聯合索引最左邊開始匹配。建立一個聯合索引(key1,key2,key3),其實建立了(key1)(key1,key2)(key1,key2,key3)三個索引。

索引下推、查詢優化

mysql 5.6版本優化內容:Index Condition Pushdown(索引下推)預設開啟,
比如:

people表中(zipcode,lastname,firstname)構成一個索引

SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';
  • 如果沒有使用索引下推技術,則MySQL會通過zipcode='95054'從儲存引擎中查詢對應的資料,返回到MySQL服務端,然後MySQL服務端基於lastname LIKE '%etrunia%'和address LIKE '%Main Street%'來判斷資料是否符合條件。
  • 如果使用了索引下推技術,則MYSQL首先會返回符合zipcode='95054'的索引,然後根據lastname LIKE '%etrunia%'和address LIKE '%Main Street%'來判斷索引是否符合條件。如果符合條件,則根據該索引來定位對應的資料,如果不符合,則直接reject掉。有了索引下推優化,可以在有like條件查詢的情況下,減少回表次數。

如果對大家有幫助,請大家多點贊。。。

本文作者:好名字
原文連結:https://www.cuizb.top/article/1637767177
版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY 3.0 CN協議進行許可。轉載請署名作者且註明文章出處。