索引說明sql
索引是數據庫對象之一,用於加快數據的檢索,相似於書籍的索引
在數據庫中索引能夠減小數據庫程序查詢結果時須要讀取的數據量,相似於在書籍中咱們利用索引能夠不用翻閱整本書便可找到想要的信息數據庫
索引是創建在表上的可選對象
索引的關鍵在於經過一組排序後的索引鍵來取代默認的全表掃描檢索方式,從而提升檢索效率express
索引在邏輯上和物理上都與相關的表和數據無關,當建立或者刪除一個索引時,不會影響基本的表oracle
索引一旦創建,在表上進行DML操做時(如insert,delete,update等操做),oracle會自動管理索引函數
索引對用戶是透明的,不管表上是否有索引,sql語句的用法不變
就是說無論建立了什麼樣的索引,建立的索引有多麼複雜,sql腳本無需作任何針對索引的改動優化
oracle建立主鍵時會自動在該列上建立索引ui
索引原理spa
若沒有索引,當檢索符合某個where條件的記錄時,oracle則會檢索整個表
若在某個字段上創建索引,在建立索引時,oracle會對全表進行一次全盤檢索
將整個記錄的該字段按升序排列,而後構建索引條目(該索引字段和rowid),存儲到索引段中
當where條件中使用到了該字段,便可直接查找對應地方
建立了索引並不必定就會使用,oracle自動統計表的信息後,決定是否使用索引
當表中數據不多時使用全表掃描速度已經很快,沒有必要使用索引code
索引使用(建立、修改、刪除、查看) 對象
建立索引
CREATE [UNIQUE] | [BITMAP] INDEX index_name --unique表示惟一索引,bitmap,建立位圖索引 ON table_name([column1 [ASC|DESC],column2 [ASC|DESC],…] | [express]) [TABLESPACE tablespace_name] [PCTFREE n1] --指定索引在數據塊中空閒空間 [STORAGE (INITIAL n2)] [NOLOGGING] --表示建立和重建索引時容許對錶作DML操做,默認狀況下不該該使用 [NOLINE] [NOSORT]; --表示建立索引時不進行排序,默認不適用,若是數據已是按照該索引順序排列的可使用
修改索引
重命名索引
alter index index_sno rename to bitmap_index;
合併索引
表使用一段時間後在索引中會產生碎片,此時索引效率會下降,能夠選擇重建索引或者合併索引,合併索引方式更好些,無需額外存儲空間,代價較低
alter index index_sno coalesce;
重建索引
方式一:刪除原來的索引,從新創建索引
方式二:alter index index_sno rebuild;
刪除索引
drop index index_sno;
查看索引
select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename'; --例如: create index index_sno on student('name'); select * from all_indexes where table_name='student';
索引分類
B樹索引(默認索引)
B樹索引是oracle中最經常使用的索引,也是默認索引,它保存了通過排序的索引列和對應的ROWID值
B樹索引就是一顆二叉樹,葉子節點(雙向鏈表)包含索引列和指向表中每一個匹配行的ROWID值
全部葉子節點具備相同的深度,於是無論查詢條件怎樣,查詢速度基本相同
可以適應精確查詢、模糊查詢和比較查詢
分類
UNIQUE
NON-UNIQUE(默認)
REVERSE KEY(數據列中的數據是反向存儲的)
建立例
create index index_sno on student('sno');
適合場景
列基數(列不重複值的個數)大時適合使用B數索引
位圖索引
建立位圖索引時,oracle會掃描整張表,併爲索引列的每一個取值創建一個位圖
位圖中,對錶中每一行使用一位(bit,0或者1)來標識該行是否包含該位圖的索引列的取值
若是爲1,表示對應的rowid所在的記錄包含該位圖索引列值
最後經過位圖索引中的映射函數完成位到行的ROWID的轉換
建立例
create bitmap index index_sno on student(sno);
適合場景
對於基數小的列適合簡歷位圖索引(例如性別等)
單列索引和複合索引(基於多個列建立)
若是索引創建在多個列上,只有它的第一個列被where子句引用時,優化器纔會使用該索引,即至少要包含組合索引的第一列
函數索引
當常常要訪問一些函數或者表達式時,能夠將其存儲在索引中,這樣下次訪問時,該值已經計算出來了,能夠加快查詢速度
函數索引既可使用B數索引,也可使用位圖索引;當函數結果不肯定時採用B樹索引,結果是固定的某幾個值時使用位圖索引
函數索引中能夠隨意用len、trim、substr、upper(每行返回獨立結果),不能使用如sum、max、min、avg等
建立例
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中止使用索引,例如:
create index index_name on student('name'); --在name上建立索引; select * from student where name like '%wish%'; --通配符出如今字符串的詞首,oracle不適用name索引 select * from student where name like 'wish%'; --通配符出如今字符串的其餘位置時,優化器可以利用索引
不要在索引列上使用not,oracle碰到not會中止使用索引而採用全表掃描,能夠採用以下其餘方式代替
--如下方式不會使用索引 select * from student where score not in (100); select * from student where not (score=100); select * from student where score <> 100; --替換爲該種方式可正常使用索引 select * from student where score>100 or score <100;
索引上使用空值比較將中止使用索引
select * from student where score is not null;