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條件查詢的情況下,減少回表次數。

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

本文作者:好名字
原文鏈接:MySQL的B+樹索引和hash索引的區別
版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY 3.0 CN協議進行許可。轉載請署名作者且注明文章出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM