問題思考
資料庫索引的資料結構有很多種,比如:哈希索引、平衡二叉樹索引、B樹索引、B+樹索引等等,
目前最流行的是B+樹索引,那大家有沒有想過為什么是B+樹索引最流行,為什么其他索引應用不廣泛,
就像為什么別人能拿2-3萬的工資,我卻只能拿一萬的工資,大家有思考過嗎?
哈希索引
hash大家應該非常的熟悉,就是我們老生常談的HashMap里用到的技術,Hash索引其檢索效率非常高,索引的檢索可以一次定位,
可能很多人又有疑問了,既然Hash索引的效率這么高,為什么都用Hash索引而還要使用B-Tree索引呢?
任何事物都是有兩面性的,Hash索引也一樣,雖然Hash索引效率高,但是Hash索引本身由于其特殊性也帶來了很多限制和弊端,主要有以下這些:
原因一:
Hash索引不能使用范圍查詢
Hash索引僅僅能滿足"=","IN"和"<=>"查詢(注意<>和<=>是不同的操作),不能使用范圍查詢,例如WHERE price > 100,
由于Hash索引比較的是進行Hash運算之后的Hash值,所以它只能用于等值的過濾,不能用于基于范圍的過濾,
原因二:
Hash索引不能利用部分索引鍵查詢,
對于復合索引,Hash索引在計算Hash值的時候,是組合索引鍵合并后再一起計算Hash值,而不是單獨計算Hash值,
所以通過復合索引的前面一個或幾個索引鍵進行查詢的時候,Hash索引也無法被利用,
原因三:
Hash索引在任何時候都不能避免表掃描,
Hash索引是將索引鍵通過Hash運算之后,將 Hash運算結果的Hash值和所對應的行指標資訊存放于一個Hash表中,
由于不同索引鍵存在相同Hash值,所以無法從Hash索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,并得到相應的結果,
hash索引out出局
平衡二叉樹索引
又稱 AVL樹, 它除了具備二叉查找樹的基本特征之外,還具有一個非常重要的特點:它的左子樹和右子樹都是平衡二叉樹,
且左子樹和右子樹的深度之差的絕對值(平衡因子 )不超過1,也就是說AVL樹每個節點的平衡因子只可能是-1、0和1(左子樹高度減去右子樹高度),
被淘汰的原因
-
樹的高度過高,高度越高,查找速度越慢
-
他支持范圍查找,但是他需要在進行回旋查找
比如我要找到大于5的資料
第一步我先定位到5,然后在樹上按照二叉樹規則去回旋查找大于5其他資料6、7、8、9、10,,,
如果大于5的資料很多,那速度是很慢的,
B樹索引
大家可以看到B樹和二叉樹最大的區別在于:它一個節點可以存盤兩個值,這就意味著它的樹高度,比二叉樹的高度更低,它的查詢速度就更快,這是他的優點
那為什么最侄訓是不用它呢,還是因為他在范圍查找的時候,存在回旋查詢的問題,同樣order by排序的時候效率也很低,因為要把樹上的資料手動排序一遍,
終極大佬:B+樹
它是B數的升級版,B+樹相比B樹,新增葉子節點與非葉子節點關系,
葉子節點中包含了key和value,key存盤的是1-10這些數字,value存盤的是資料存盤地址,非葉子節點中只是包含了key,不包含value,
所有相鄰的葉子節點包含非葉子節點,使用鏈表進行結合,有一定順序排序,從而范圍查詢效率非常高,
比如我們要查找大于5的資料:
-
首先我們定位到5的位置
-
然后直接將5后面的資料全部拿出來即可,因為這是有序鏈表,
已經排好序了
我們在order by排序的時候為什么要使用索引進行排序,原因就在這,
如果大家還沒懂,請留言給我吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/243455.html
標籤:Java
