資料庫索引型別及實現方式
轉自:http://www.cnblogs.com/barrywxx/p/4351901.html 1、索引定義
資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。索引是對資料庫表中一個或多個列(例如,employee 表的姓氏 (lname)
列)的值進行排序的結構。如果想按特定職員的姓來查詢他或她(二分查詢),則與在表中搜尋所有的行相比,索引有助於更快地獲取資訊。
2、建立索引的優缺點:
優點: 1.大大加快資料的檢索速度; 2.建立唯一性索引,保證資料庫表中每一行資料的唯一性; 3.加速表和表之間的連線; 4.在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。
缺點: 1.索引需要佔用資料表以外的物理儲存空間 2.建立索引和維護索引要花費一定的時間 3.當對錶進行更新操作時,索引需要被重建,這樣降低了資料的維護速度。
3、索引型別: 根據資料庫的功能,可以在資料庫設計器中建立索引:唯一索引、主鍵索引和聚集索引。 儘管唯一索引有助於定位資訊,但為獲得最佳效能結果,建議改用主鍵或唯一約束。 唯一索引: UNIQUE 例如:create unique index stusno on student(sno); 表明此索引的每一個索引值只對應唯一的資料記錄,對於單列惟一性索引,這保證單列不包含重複的值。對於多列惟一性索引,保證多個值的組合不重複。 主鍵索引: primary key 資料庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。 在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。 聚集索引(也叫聚簇索引):cluster 在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。 如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。
4、索引的實現方式
1 B+樹 我們經常聽到B+樹就是這個概念,用這個樹的目的和紅黑樹差不多,也是為了儘量保持樹的平衡,當然紅黑樹是二叉樹,但B+樹就不是二叉樹了,節點下面可以有多個子節點,資料庫開發商會設定子節點數的一個最大值,這個值不會太小,所以B+樹一般來說比較矮胖,而紅黑樹就比較瘦高了。 關於B+樹的插入,刪除,會涉及到一些演算法以保持樹的平衡,這裡就不詳述了。ORACLE的預設索引就是這種結構的。 如果經常需要同時對兩個欄位進行AND查詢,那麼使用兩個單獨索引不如建立一個複合索引,因為兩個單獨索引通常資料庫只能使用其中一個,而使用複合索引因為索引本身就對應到兩個欄位上的,效率會有很大提高。 2 雜湊索引 第二種索引叫做雜湊索引,就是通過雜湊函式來定位的一種索引,不過很少有單獨使用雜湊索引的,反而是雜湊檔案組織用的比較多。 雜湊檔案組織就是根據一個鍵通過雜湊計算把對應的記錄都放到同一個槽中,這樣的話相同的鍵值對應的記錄就一定是放在同一個檔案裡了,也就減少了檔案讀取的次數,提高了效率。 雜湊索引呢就是根據對應鍵的雜湊碼來找到最終的索引項的技術,其實和B樹就差不多了,也就是一種索引之上的二級輔助索引,我理解雜湊索引都是二級或更高階的稀疏索引,否則桶就太多了,效率也不會很高。 3 點陣圖索引 點陣圖索引是一種針對多個欄位的簡單查詢設計一種特殊的索引,適用範圍比較小,只適用於欄位值固定並且值的種類很少的情況,比如性別,只能有男和女,或者級別,狀態等等,並且只有在同時對多個這樣的欄位查詢時才能體現出點陣圖的優勢。 點陣圖的基本思想就是對每一個條件都用0或者1來表示,如有5條記錄,性別分別是男,女,男,男,女,那麼如果使用點陣圖索引就會建立兩個點陣圖,對應男的10110和對應女的01001,這樣做有什麼好處呢,就是如果同時對多個這種型別的欄位進行and或or查詢時,可以使用按位與和按位或來直接得到結果了。 B+樹最常用,效能也不差,用於範圍查詢和單值查詢都可以。特別是範圍查詢,非得用B+樹這種順序的才可以了。 HASH的如果只是對單值查詢的話速度會比B+樹快一點,但是ORACLE好像不支援HASH索引,只支援HASH表空間。 點陣圖的使用情況很侷限,只有很少的情況才能用,一定要確定真正適合使用這種索引才用(值的型別很少並且需要複合查詢),否則建立一大堆點陣圖就一點意義都沒有了。
相關文章
- MySQL的索引型別和實現原理MySql索引型別
- 關係型資料庫之索引資料庫索引
- H2資料庫函式及資料型別概述資料庫函式資料型別
- Java資料型別及型別轉換Java資料型別
- 1-庫表檢視及常用資料型別資料型別
- Redis 資料型別及操作Redis資料型別
- 資料型別及長度資料型別
- 資料型別及轉換資料型別
- 常用資料庫基本資料型別資料庫資料型別
- 資料型別與函式索引-PostgreSQL篇資料型別函式索引SQL
- 資料型別與函式索引-MySQL篇資料型別函式索引MySql
- 資料型別與函式索引-Oracle篇資料型別函式索引Oracle
- Oracle資料庫索引使用及索引失效總結 轉Oracle資料庫索引
- 資料庫建表及索引規約資料庫索引
- 面試官:Redis中集合資料型別的內部實現方式是什麼?面試Redis資料型別
- Redis資料結構(一)-Redis的資料儲存及String型別的實現Redis資料結構型別
- C++基本資料型別及型別轉換C++資料型別
- 基本資料型別與引用資料型別,及記憶體分配資料型別記憶體
- 資料庫方式實現方案?有什麼缺陷?資料庫
- 資料庫型別區分資料庫型別
- 聊聊非關係型資料庫MongoDB索引資料庫MongoDB索引
- js資料型別及判斷JS資料型別
- JavaScript資料型別及輸出JavaScript資料型別
- redis-資料型別及命令Redis資料型別
- Mysql資料庫學習(二):資料型別(數值型別 日期和時間型別 字串型別)MySql資料庫資料型別字串
- 面試官:Redis中雜湊資料型別的內部實現方式是什麼?面試Redis資料型別
- 資料庫索引為什麼用B+樹實現?資料庫索引
- RAW資料型別可以建立索引,但是不走索引測試(轉)資料型別索引
- 【資料庫】資料庫儲存元素型別基礎資料庫型別
- Winform開發框架中實現多種資料庫型別切換以及分拆資料庫的支援ORM框架資料庫型別
- 【資料庫】mysql資料庫索引資料庫MySql索引
- Java資料型別與資料庫欄位型別對應關係Java資料型別資料庫
- Redis 實戰篇:巧用資料型別實現億級資料統計Redis資料型別
- 資料庫索引資料庫索引
- 關係型資料庫和非關係型資料庫的區別資料庫
- MySQL(二) 資料庫資料型別詳解MySql資料庫資料型別
- java處理資料庫date型別資料Java資料庫型別
- Redis的五大資料型別實現原理Redis大資料資料型別