前言:本文解決的問題
- Oracle中使用Index一定會加快查找速度嗎?
- B+Tree和Bitmap索引的區別
- 索引的原理
1 索引的基本概念
索引是一種數據庫結構,能夠就數據庫中的某列提供快速查詢,而不用檢索整個表格。建立索引時,oracle會首先對全表進行搜索,然后把要建立索引的字段排序,並構建構建索引條目(包含字段值和該字段在原表中的地址值rowid),把索引條目存儲到索引段中。
An index is a database structure that provides quick lookup of data in a column or columns of a table.
說到底了,這是用空間來換時間,但是查找對於經常要搜索的字段,尤其對於table數據很多的情況下,有索引速度還是快很多。可以形象地把索引類比於百科全書的目錄,雖然多了幾頁目錄,但是查找起來不需要一頁一頁搜尋,速度還是快很多。
2 索引的分類
索引里面的元素是排序的,如果不止一列,那么第一列是主排序,然后再根據后面的列順序依次排序。oracle中默認使用的是B-Tree索引。
2.1B-Tree索引(ORACLE默認的)
B-Tree是一種平衡樹,數據存儲在葉子節點上,檢索節點上的數據所走的步數長度是一樣的,數據結構見下圖。
2.11語法B-Tree基本介紹
`` create index <index_name> on <table_name> ( <column1>, <column2>, … );
2.12例子
2.2Bitmap索引
Bitmap類index是存儲在一個二維表中,行是rowid,列名稱是屬性的取值范圍,表格中的數據是屬性值。具體如下
Bitmap主要用於選定的列中,屬性取值范圍比較小的,如為性別(male,female),衣服尺寸(S,M,L)等,而且在讀取比較多的系統中使用較多。
2.21 語法
CREATE BITMAP INDEX Index_Name ON Table_Name (Column_Name);
2.22 例子
2.3 二者區別
B-Tree索引適合屬性值取值范圍很大的,而bitmap索引適合於屬性值取值范圍小的。
3使用索引注意事項
- oracle創建主鍵時會自動在該列上創建索引
- 經常進行連接查詢的列應該創建索引
- 使用create index時要將最常查詢的列放在最前面
- 在使用where和join的屬性上建立索引
- 在外鍵(foreign key)上建立索引
4 索引的缺點
-
索引並不一定加快查詢速度,尤其是對於比較小的表來說
-
索引是用空間換時間來實現快速查詢,因此也勢必會拖慢insert、delete、update等操作,因為每次操作后索引也必須更新。
參考文獻
https://dev.to/databasestar/a-guide-to-indexes-in-oracle
https://docs.oracle.com/cd/E11882_01/server.112/e40540/indexiot.htm#CNCPT811
https://www.cnblogs.com/wishyouhappy/p/3681771.html