清明節一個人在家,已經混了一天了,想想還是寫點什么吧。
以前對數據庫的理解總是停留在使用的階段,沒有去研究過深層次的東西,這兩天正好有空(其實也是工作需要),看了一下數據庫索引的一些基礎的東西,希望通過這篇博文,整理一下自己的思路。
1.什么是索引?
我想這個用過數據庫的人都應該知道了,索引類似于書的目錄,主要用于提高查詢效率,也就是按條件查詢的時候,先查詢索引,再通過索引找到相關的數據,索引相當于記錄了對某個關鍵詞,指定到不同的文件,或者文件里的不同位置,當然索引自身也是通過文件來保存的。
2.索引的類型
有兩種基本的索引結構,也就是索引文件的保存方式,一個是順序索引,就是根據值的順序排序的(這個文件里面的值,也就是為其建索引的字段值,是順序的放在索引文件里面),另外一個是散列索引,就是將值平均分配到若干散列桶中,通過散列函數定位的。
2.1.順序索引
順序索引下面又有很多概念。
如果被索引的字段本身按照一定的順序排序,那么這種索引叫做聚集索引。否則叫做非聚集索引。
如果被索引的字段的每個值都有一個索引與其對應,那么這種索引叫做稠密索引,否則叫做稀疏索引。
順序索引分為兩類,單級索引(不怎么用)和多級索引(通常是B+樹,大量使用)。
單級索引就是把所有的索引字段以及對應的文件位置按順序一個個的排列出來,這種索引查找起來比較慢,因為是順序存儲的,可以使用二分查找法,但是總體來說效率不高,這種索引是最基礎的索引,一般不用,ORACLE里面好像不支持這種索引。
多級索引實際上就是在單級索引之上再加索引(稀疏索引),也就是指向索引的索引,二級索引上面還可以再加三級索引,可以不停的加,加到最后最上層只剩下一個節點(根節點),就成了一個樹狀結構了。
我
們經常聽到B+樹就是這個概念,用這個樹的目的和紅黑樹差不多,也是為了盡量保持樹的平衡,當然紅黑樹是二叉樹,但B+樹就不是二叉樹了,節點下面可以有
多個子節點,數據庫開發商會設置子節點數的一個最大值,這個值不會太小,所以B+樹一般來說比較矮胖,而紅黑樹就比較瘦高了。
關于B+樹的插入,刪除,會涉及到一些算法以保持樹的平衡,這里就不詳述了。ORACLE的默認索引就是這種結構的。
如果經常需要同時對兩個字段進行AND查詢,那么使用兩個單獨索引不如建立一個復合索引,因為兩個單獨索引通常數據庫只能使用其中一個,而使用復合索引因為索引本身就對應到兩個字段上的,效率會有很大提高。
2.2 散列索引
第二種索引叫做散列索引,就是通過散列函數來定位的一種索引,不過很少有單獨使用散列索引的,反而是散列文件組織用的比較多。
散列文件組織就是根據一個鍵通過散列計算把對應的記錄都放到同一個槽中,這樣的話相同的鍵值對應的記錄就一定是放在同一個文件里了,也就減少了文件讀取的次數,提高了效率。
散列索引呢就是根據對應鍵的散列碼來找到最終的索引項的技術,其實和B樹就差不多了,也就是一種索引之上的二級輔助索引,我理解散列索引都是二級或更高級的稀疏索引,否則桶就太多了,效率也不會很高。
2.3 位圖索引
位圖索引是一種針對多個字段的簡單查詢設計一種特殊的索引,適用范圍比較小,只適用于字段值固定并且值的種類很少的情況,比如性別,只能有男和女,或者級別,狀態等等,并且只有在同時對多個這樣的字段查詢時才能體現出位圖的優勢。
位
圖的基本思想就是對每一個條件都用0或者1來表示,如有5條記錄,性別分別是男,女,男,男,女,那么如果使用位圖索引就會建立兩個位圖,對應男的
10110和對應女的01001,這樣做有什么好處呢,就是如果同時對多個這種類型的字段進行and或or查詢時,可以使用按位與和按位或來直接得到結果
了。
總結:
B+樹最常用,性能也不差,用于范圍查詢和單值查詢都可以。特別是范圍查詢,非得用B+樹這種順序的才可以了。
HASH的如果只是對單值查詢的話速度會比B+樹快一點,但是ORACLE好像不支持HASH索引,只支持HASH表空間。
位圖的使用情況很局限,只有很少的情況才能用,一定要確定真正適合使用這種索引才用(值的類型很少并且需要復合查詢),否則建立一大堆位圖就一點意義都沒有了。