
Root為根節點,branch 為分支節點,leaf 到最下面一層稱為葉子節點。每個節點表示一層,當查找某一數據時先讀根節點,再讀支節點,最后找到葉子節點。葉子節點會存放index entry (索引入口),每個索引入口對應一條記錄。
Index entry 的組成部分:
Indexentry entry header 存放一些控制信息。
Key column length 某一key的長度
Key column value 某一個key 的值
ROWID 指針,具體指向于某一個數據
創建索引:
創建表:
SQL> create table dex (id int,sex char(1),name char(10));
Table created.
向表中插入1000條數據
SQL> begin
for i in 1..1000
loop
insert into dex values(i,'M','chongshi');
end loop;
commit;
end;
/
PL/SQL procedure successfully completed.
查看表記錄
SQL> select * from dex;
ID SE NAME
---------- -- --------------------
... . .....
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
rows selected.
創建索引:
SQL> create index dex_idx1 on dex(id);
Index created.
注:對表的第一列(id)創建索引。
查看創建的表與索引
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
--------------------------------------------------------------------------------
DEX TABLE
DEX_IDX1 INDEX
索引分離于表,作為一個單獨的個體存在,除了可以根據單個字段創建索引,也可以根據多列創建索引。Oracle要求創建索引最多不可超過32列。
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
--------------------------------------------------------------------------------
DEX TABLE
DEX_IDX1 INDEX
DEX_INDEX2 INDEX
這里需要理解:
編寫一本書,只有章節頁面定好之后再設置目錄;數據庫索引也是一樣,只有先插入好數據,再建立索引。那么我們后續對數據庫的內容進行插入、刪除,索引也需要隨之變化。但索引的修改是由oracle自動完成的。

上面這張圖能更加清晰的描述索引的結構。
跟節點記錄0至50條數據的位置,分支節點進行拆分記錄0至10.......42至50,葉子節點記錄每第數據的長度和值,并由指針指向具體的數據。
最后一層的葉子節是雙向鏈接,它們是被有序的鏈接起來,這樣才能快速鎖定一個數據范圍。
如:
ID SE NAME
---------- -- --------------------
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
M chongshi
rows selected.
如上面查找的列子,通過索引的方式先找到第23條數據,再找到第32條數據,這樣就能快速的鎖定一個查找的范圍,如果每條數據都要從根節點開始查找的話,那么效率就會非常低下。
位圖索引
位圖索引主要針對大量相同值的列而創建。拿全國居民登錄一第表來說,假設有四個字段:姓名、性別、年齡、和身份證號,年齡和性別兩個字段會產生許多相同的值,性別只有男女兩種值,年齡,1到120(假設最大年齡120歲)個值。那么不管一張表有幾億條記錄,但根據性別字段來區分的話,只有兩種取值(男、女)。那么位圖索引就是根據字段的這個特性所建立的一種索引。
Bitmap Index

從上圖,我們可以看出,一個葉子節點(用不同顏色標識)代表一個key , start rowid 和 end rowid規定這種類型的檢索范圍,一個葉子節點標記一個唯一的bitmap值。因為一個數值類型對應一個節點,當時行查詢時,位圖索引通過不同位圖取值直接的位運算(與或),來獲取到結果集合向量(計算出的結果)。
舉例講解:
假設存在數據表T,有兩個數據列A和B,取值如下,我們看到A和B列中存在相同的數據。

對兩個數據列A、B分別建立位圖索引:idx_t_bita和idx_t_bitb。兩個索引對應的存儲邏輯結構如下:
Idx_t_bita索引結構,對應的是葉子節點:

Idx_t_bitb索引結構,對應的是葉子節點:

對于上面表來說sex(性別)只有兩種值,最適合用來創建位圖所引
創建索引:
SQL> create bitmap index my_bit_idx on dex(sex);
Index created.
查看創建的所引
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
--------------------------------------------------------------------------------
MY_BIT_IDX INDEX
創建索引的一些規則
1、權衡索引個數與DML之間關系,DML也就是插入、刪除數據操作。
這里需要權衡一個問題,建立索引的目的是為了提高查詢效率的,但建立的索引過多,會影響插入、刪除數據的速度,因為我們修改的表數據,索引也要跟著修改。這里需要權衡我們的操作是查詢多還是修改多。
2、把索引與對應的表放在不同的表空間。
當讀取一個表時表與索引是同時進行的。如果表與索引和在一個表空間里就會產生資源競爭,放在兩個表這空就可并行執行。
3、最好使用一樣大小是塊。
Oracle默認五塊,讀一次I/O,如果你定義6個塊或10個塊都需要讀取兩次I/O。最好是5的整數倍更能提高效率。
4、如果一個表很大,建立索引的時間很長,因為建立索引也會產生大量的redo信息,所以在創建索引時可以設置不產生或少產生redo信息。只要表數據存在,索引失敗了大不了再建,所以可以不需要產生redo信息。
5、建索引的時候應該根據具體的業務SQL來創建,特別是where條件,還有where條件的順序,盡量將過濾大范圍的放在后面,因為SQL執行是從后往前的。(小李
主站蜘蛛池模板:
文昌市|
庆云县|
萨迦县|
衢州市|
肥东县|
惠安县|
章丘市|
博湖县|
融水|
灵璧县|
湟源县|
分宜县|
璧山县|
潍坊市|
翁源县|
和平县|
建湖县|
石城县|
布尔津县|
镶黄旗|
水富县|
天台县|
田东县|
根河市|
沂水县|
西昌市|
彰化县|
黑龙江省|
蓝山县|
岑巩县|
边坝县|
大渡口区|
克拉玛依市|
梅州市|
上饶市|
铁岭县|
华蓥市|
兴隆县|
光泽县|
重庆市|
泽库县|