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