簡介html
一、說明sql
1)索引是數據庫對象之一,用於加快數據的檢索,相似於書籍的目錄。在數據庫中索引能夠減小數據庫程序查詢結果時須要讀取的數據量,相似於在書籍中咱們利用目錄能夠不用翻閱整本書便可找到想要的信息。數據庫
2)索引是創建在表上的可選對象;索引的關鍵在於經過一組排序後的索引鍵來取代默認的全表掃描檢索方式,從而提升檢索效率。express
3)索引在邏輯上和物理上都與相關的表和數據無關,當建立或者刪除一個索引時,不會影響基本的表;oracle
4)索引一旦創建,在表上進行DML操做時(例如在執行插入、修改或者刪除操做時),oracle會自動管理索引,索引刪除,不會對錶產生影響。app
5)索引對用戶是透明的,不管表上是否有索引,sql語句的用法不變函數
6)oracle建立主鍵時會自動在該列上建立索引優化
索引原理ui
一、若沒有索引,搜索某個記錄(例如查找name='wish')須要搜索全部的記錄,由於不能保證只有一個wish,必須所有搜索一遍。spa
二、若在name上創建索引,oracle會對全表進行一次搜索,將每條記錄的name值按照升序排列,而後構建索引條目(name和rowid),存儲到索引段中,查詢name爲wish時便可直接查找對應對方。
三、建立了索引並不必定就會使用,oracle自動統計表的信息後,決定是否使用索引,表中數據不多時使用全表掃描速度已經很快,沒有必要使用索引。
索引使用(建立、修改、刪除、查看)
一、建立索引語法
1 CREATE [UNIQUE] | [BITMAP] INDEX index_name --unique表示惟一索引 2 ON table_name([column1 [ASC|DESC],column2 --bitmap,建立位圖索引 3 [ASC|DESC],…] | [express]) 4 [TABLESPACE tablespace_name] 5 [PCTFREE n1] --指定索引在數據塊中空閒空間 6 [STORAGE (INITIAL n2)] 7 [NOLOGGING] --表示建立和重建索引時容許對錶作DML操做,默認狀況下不該該使用 8 [NOLINE] 9 [NOSORT]; --表示建立索引時不進行排序,默認不適用,若是數據已是按照該索引順序排列的可使用
二、修改索引
1)重命名索引
alter index index_sno rename to bitmap_index;
2)合併索引(表使用一段時間後在索引中會產生碎片,此時索引效率會下降,能夠選擇重建索引或者合併索引,合併索引方式更好些,無需額外存儲空間,代價較低)
alter index index_sno coalesce;
3)重建索引
alter index index_sno rebuild;
三、刪除索引
drop index index_sno;
四、查看索引
select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename'; -- eg: create index index_sno on student('name'); select * from all_indexes where table_name='student';
索引分類
一、B樹索引(默認索引,保存排序過的索引列和對應的rowid值)
1)說明:
a.oracle中最經常使用的索引;B樹索引就是一棵二叉樹;葉子節點(雙向鏈表)包含索引列和指向表中每一個匹配行的ROWID值
b.全部葉子節點具備相同的深度,於是無論查詢條件怎樣,查詢速度基本相同
c.可以適應精準查詢、模糊查詢和比較查詢
2)分類:
UNIQUE,NON-UNIQUE(默認),REVERSE KEY(如:某一列的值爲{10000,10001,10021,10121,11000,....},假如經過b-tree索引,大部分都密集發佈在某一個葉子節點上,可是經過反向處理後的值將變成{00001,10001,12001,12101,00011,...},很明顯的發現他們的值變得比較隨機,能夠比較平均的分佈在各個葉子節點上,而不是以前所有集中在某一個葉子節點上,這樣子就可大大提升檢索的效率)
3)建立例子
craete index index_sno on student('sno');
4)適用場景
列基數(列不重複值的個數)大使適合使用B樹索引
二、位圖索引
1)說明:
建立位圖索引時,oracle會掃描整張表,併爲索引列的每一個取值創建一個位圖(位圖中,對錶中每一行使用一位(bit,0或者1)來標識該行是否包含該位圖的索引列的取值,若是爲1,表示對應的rowid所在的記錄包含該位圖索引列值),最後經過位圖索引中的映射函數完成位到行的ROWID的轉換。
2)建立例子
create bitmap index index_sno on student(sno);
3)適用場景:
對於基數小的列適合創建位圖索引(例如性別等)
三、單列索引和複合索引(基於多個列建立)
1)注意:
即若是索引創建在多個列上,只有它的第一個列被where子句引用時,優化器纔會適用該索引,即至少要包含組合索引的第一列。
2)例子:
Create Index i_deptno_job on emp(deptno,job); --在emp表的deptno、job列創建索引。 select * from emp where deptno=66 and job='sals'; --走索引。 select * from emp where deptno=66 OR job='sals'; --將進行全表掃描。不走索引 select * from emp where deptno=66; --走索引。 select * from emp where job='sals'; --進行全表掃描、不走索引。
若是在where子句中有OR操做符或單獨引用job列(索引列的後面列),則將不會走索引,將會進行全表掃描。
四、函數索引
1)說明:
a.當常常要訪問一些函數或者表達式時,能夠將其存儲在索引中,這樣下次訪問時,該值已經計算出來了,能夠加快查詢速度;
b.函數索引既可使用B樹索引,也可使用位圖索引;當函數結果不肯定時採用B樹索引,結果是固定的某幾個值時使用位圖索引;
c.函數索引中可使用len、trim、substr、upper(每行返回獨立結果),不能使用如sum、max、min、avg等。
2)例子:
create index fbi on student (upper(name)); select * from student where upper(name) ='WISH';
索引創建原則總結
一、若是有兩個或者以上的索引,其中有一個惟一性索引,而其餘是非惟一,這種狀況下oracle將使用惟一性索引而徹底忽略非惟一性索引;
二、至少要包含組合索引的第一列(即若是索引創建在多個列上,只有它的第一個列被where子句引用時,優化器纔會使用該索引);
三、小表不要創建索引;
四、對於基數大的列適合創建B樹索引,對於基數小的列適合簡歷位圖索引;
五、列中有不少空值,但常常查詢該列上非空記錄時應該創建索引;
六、常常進行鏈接查詢的列應該建立索引;
七、使用create index時要將最常查詢的列放在最前面;
八、LONG(可變長字符串數據,最長2G)和LONG RAW(可變長二進制數據,最長2G)列不能建立索引;
九、限制表中索引的數量(建立索引耗費時間,而且隨數據量的增大而增大;索引會佔用物理空間;當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,下降了數據的維護速度)。
注意事項
一、通配符在搜索詞首出現時,oracle不能使用索引,eg:
1 --咱們在name上建立索引; 2 3 create index index_name on student('name'); 4 5 --下面的方式oracle不適用name索引 6 7 select * from student where name like '%wish%'; 8 9 --若是通配符出如今字符串的其餘位置時,優化器可以利用索引;以下: 10 11 select * from student where name like 'wish%';
二、不要在索引列上使用not,能夠採用其餘方式代替以下:(oracle碰到not會中止使用索引,而採用全表掃描)
1 select * from student where not (score=100); 2 3 select * from student where score <> 100; 4 5 --替換爲 6 7 select * from student where score>100 or score <100
三、索引上使用空值比較時將中止使用索引,eg:
1 select * from student where score is not null;
轉載自《oracle索引總結》