天天看點

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子句中的字段

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

在 InnoDB 裡,索引B+ Tree的葉子節點存儲了整行資料的是主鍵索引,也被稱之為聚簇索引。而索引B+ Tree的葉子節點存儲了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引**

聚簇索引查詢會更快,因為主鍵索引樹的葉子節點直接就是我們要查詢的整行資料了。而非主鍵索引的葉子節點是主鍵的值,查到主鍵的值以後,還需要再通過主鍵的值再進行一次查詢。通過覆寫索引也可以隻查詢一次。**

覆寫索引(covering index)指一個查詢語句的執行隻用從索引中就能夠取得,不必從資料表中讀取。也可以稱之為實作了索引覆寫。**

當一條查詢語句符合覆寫索引條件時,MySQL隻需要通過索引就可以傳回查詢所需要的資料,這樣避免了查到索引後再傳回表操作,減少I/O提高效率。**

聯合索引、最左字首比對

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

索引下推、查詢優化

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

比如:

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

如果沒有使用索引下推技術,則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協定進行許可。轉載請署名作者且注明文章出處。