清明節乙個人在家,已經混了一天了,想想還是寫點什麼吧。
以前對資料庫的理解總是停留在使用的階段,沒有去研究過深層次的東西,這兩天正好有空(其實也是工作需要),看了一下資料庫索引的一些基礎的東西,希望通過這篇博文,整理一下自己的思路。
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表空間。
點陣圖的使用情況很侷限,只有很少的情況才能用,一定要確定真正適合使用這種索引才用(值的型別很少並且需要復合查詢),否則建立一大堆點陣圖就一點意義都沒有了。
MySQL資料庫主從原理理解
在日常專案測試過程中,經常會遇到mysql資料庫的主從模式,也就是主從複製和讀寫分離,主資料庫 master 資料有更新時,會同步到從資料庫 sl e master資料庫負責寫資料,而多台sl e資料庫負責讀資料,這樣便提公升了資料庫的併發效能。主要分為以下幾個步驟 1.主資料庫 master 如果...
CSS 原理理解
網頁製作最初,html規定了 normal document stream 標準文件流 來規範元素在網頁中的顯示法則 標準文件流中元素分兩種 塊內元素,行內元素。行內元素的特點 span標籤 豎直margin中的塌陷現象,上下緊密排列的元素的外邊距並不是兩個元素外邊距之和,而是選取那個最大的外邊距作...
Spring IOC原理理解
ioc,inversion of control,控制倒轉。這是spring的核心,貫穿始終。所謂ioc,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係。di,dependency injection,依賴注入。在系統執行中,動態的向某個物件提供它所需要的其他物件...