索引方式:真的是用的B+Tree 吗?
在Navicat 的工具中,創(chuàng)建索引,索引方式有兩種,Hash 和B Tree。
HASH:以KV 的形式檢索數(shù)據(jù),也就是說,它會根據(jù)索引字段生成哈希碼和指針,指針指向數(shù)據(jù)。
哈希索引有什么特點(diǎn)呢?
第一個,它的時(shí)間復(fù)雜度是O(1),查詢速度比較快。因?yàn)楣K饕锩娴臄?shù)據(jù)不是按順序存儲的,所以不能用于排序。?
第二個,我們在查詢數(shù)據(jù)的時(shí)候要根據(jù)鍵值計(jì)算哈希碼,所以它只能支持等值查詢(= IN),不支持范圍查詢(> < >= <= between and)。
另外一個就是如果字段重復(fù)值很多的時(shí)候,會出現(xiàn)大量的哈希沖突(采用拉鏈法解決),效率會降低。
問題: InnoDB 可以在客戶端創(chuàng)建一個索引,使用哈希索引嗎?
https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html
InnoDB utilizes hash indexes internally for its Adaptive Hash Index feature
直接翻譯過來就是:InnoDB 內(nèi)部使用哈希索引來實(shí)現(xiàn)自適應(yīng)哈希索引特性。
這句話的意思是InnoDB 只支持顯式創(chuàng)建B+Tree 索引,對于一些熱點(diǎn)數(shù)據(jù)頁,InnoDB 會自動建立自適應(yīng)Hash 索引,也就是在B+Tree 索引基礎(chǔ)上建立Hash 索引,這個過程對于客戶端是不可控制的,隱式的。
我們在Navicat 工具里面選擇索引方法是哈希,但是它創(chuàng)建的還是B+Tree 索引,這個不是我們可以手動控制的。
上次課我們說到buffer pool 里面有一塊區(qū)域是Adaptive Hash Index 自適應(yīng)哈希索引,就是這個。
這個開關(guān)默認(rèn)是ON:
show variables like 'innodb_adaptive_hash_index';從存儲引擎的運(yùn)行信息中可以看到:
show engine innodb status\G----------------------
BUFFER POOL AND MEMORY
----------------------
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
因?yàn)锽 Tree 和B+Tree 的特性,它們廣泛地用在文件系統(tǒng)和數(shù)據(jù)庫中,例如Windows的HPFS 文件系統(tǒng),Oracel、MySQL、SQLServer 數(shù)據(jù)庫。
?
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的索引方式:真的是用的B+Tree 吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么不用红黑树?
- 下一篇: 索引使用原则-列的离散(sàn)度