oracle 經常使用索引分析,使用原則和注意事項

本文參考:

http://www.javashuo.com/article/p-djjggnyy-gb.htmlhtml

https://blog.csdn.net/weivi001/article/details/45498405mysql

索引簡介

• 索引(index)是數據庫對象的一種。索引的關鍵在於經過一組排序後的物理地址做爲鍵來取代默認的全表掃描檢索方式,就像爲書本添加目錄,經過犧牲物理內存的方式提升數據的檢索效率。sql

它對用戶時透明的,它的建立不會影響對錶的sql操做。索引一旦創建,在表上進行DML操做時(例如在執行插入、修改或者刪除相關操做時),oracle會自動管理索引。數據庫

• oracle建立主鍵時會自動建立索引數據結構

添加索引

1.建立默認索引oracle

CREATE UNIQUE INDEX (索引名稱) ON 表名 (列名1,列名2...) ;   --unique(默認)表示惟一索引app

2.修改索引優化

alter index (舊索引名稱) rename to(新索引名稱);spa

3.刪除索引.net

drop index (索引名稱);

4.查看索引

查看某表的全部索引:

select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name =(表名);

經常使用的2種索引及適用場景

1.b樹索引(默認索引,保存排序過的索引列和對應的rowid值)

b樹索引是oracle最多見的的索引,它的原理是利用了b-樹的數據結構(b樹的原理:https://blog.csdn.net/baidu_30569267/article/details/80983295

b樹索引結構圖:

 

b樹的全部葉子節點擁有相同的深度,oracle將索引列和對應的rowid值存入葉子節點上,所以全部的檢索速度基本都是相同的。

b樹索引的不適用場景:

不適合鍵值較少的列(重複數據較多的列)

假如索引列TYPE有5個鍵值,若是有1萬條數據,那麼 WHERE TYPE = 1將訪問表中的2000個數據塊。再加上訪問索引塊,一共要訪問大於200個的數據塊。

若是全表掃描,假設10條數據一個數據塊,那麼只需訪問1000個數據塊,既然全表掃描訪問的數據塊少一點,確定不會利用b樹索引了。

(不過,事實上,當取出的行數據佔用表中大部分的數據時,即便添加了B樹索引,數據庫如oracle、mysql也不會使用B樹索引,頗有可能仍是一行行所有掃描)

2.位圖索引(bit-map index)

位圖索引是對列的每一個鍵值設置一個位圖。
 
好比有這樣一列a:
 
 10    20    30    20    10    30    10    30    20    30
 
那麼會創建三個位圖,以下:
 
KEY=10  1    0    0    0    1    0    1    0    0    0   
KEY=20  0    1    0    1    1    0    0    0    1    0 
KEY=30  0    0    1    0    0    1    0    1    0    1 

這適合於該列的基數很是小的狀況,當創建位圖索引時,會爲每一個獨立的值創建向量,好比上面3個,就會創建3個向量:key=10: 1000101000,key=20: 0101100010...

 

若是再有一列b:

x y x x y y y x y

key = x : 1 0 1 1 0 0 0 1 0

key = y : 0 1 0 0 1 1 1 0 1

若是你對a列和b列使用 and 或者 or操做,這裏就會體現位圖索引使用bit的優點:好比 "a=10 and b =x " :它會將 key=10 :100010100向量 和  b=x :101100010向量進行與操做,更快的取出索引對應的行

適用場景:

和B樹索引相反,位圖索引適合鍵值重複率高的表,若重複值很低,則位圖索引相對的會須要大量數據。因爲位圖索引採用0,1記錄某行是否包含該鍵值,所以很是適合AND, OR, NOT,count等這樣的邏輯操做。
位圖索引很是不適合有大量「寫」的操做,由於每個位圖鍵值中,均可能對於多條記錄,當修改一條記錄更新位圖鍵值時,會在對應的位圖索引鍵上加鎖,從而致使對其它記錄的修改也會被阻塞。

什麼狀況下須要創建索引

1. 若是有兩個或者以上的索引,其中有一個惟一性索引,而其餘是非惟一,這種狀況下oracle將使用惟一性索引而徹底忽略非惟一性索引

2. 至少要包含組合索引的第一列(即若是索引創建在多個列上,只有它的第一個列被where子句引用時,優化器纔會使用該索引),所以最常查詢的列應該放在前面

3.小表不須要創建索引

4.列中有不少空值,但常常查詢該列上非空記錄時應該創建索引

5.常常進行鏈接查詢的列應該建立索引

6. LONG(可變長字符串數據,最長2G)和LONG RAW(可變長二進制數據,最長2G)列不能建立索引

7.一般來講,表的索引越多,其查詢的速度也就越快。可是,表的更新速度則會下降。這主要是由於,在更新記錄的同時須要更新相關的索引信息。爲此,須要在這個更新速度與查詢速度之間取得一個均衡點。同時過多的索引會增長物理內存,數據庫管理員須要按期去優化索引。

sql中沒法使用索引的狀況

1.通配符在搜索詞首出現時不能用索引:

--下面的方式oracle不適用name索引

select * from student where name like '%wish%';

--若是通配符出如今字符串的其餘位置時,優化器可以利用索引;以下:

select * from student where name like 'wish%';

2.不要在查詢條件中使用not:

select * from student where not (score=100);

select * from student where score <> 100;

--替換爲 select * from student where score>100 or score <100

 

3. b樹索引上使用空值比較將中止使用索引,Oracle的索引不保存所有爲空的行:

select * from student where score is not null;

select * from student where score is null;

 

有一個能夠變通的方法,即咱們在建立表的時候,爲每一個列都指定爲非空約束(NOT NULL),而且在必要的列上使用default值

相關文章
相關標籤/搜索