數據庫索引有哪幾種


  • 種類:

1、按照索引列值的唯一性,索引可分為唯一索引和非唯一索引;

  • 非唯一索引:

create index 索引名 on 表名(列名) tablespace 表空間名;

  • 唯一索引:

建立主鍵或者唯一約束時會自動在對應的列上建立唯一索引;

2、索引列的個數:單列索引和復合索引;

3、按照索引列的物理組織方式。

  • 索引的創建格式: 

CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>     ON <schema>.<table_name>     (<column_name> | <expression> ASC | DESC,      <column_name> | <expression> ASC | DESC,...)     TABLESPACE <tablespace_name>     STORAGE <storage_settings>     LOGGING | NOLOGGING     COMPUTE STATISTICS     NOCOMPRESS | COMPRESS<nn>     NOSORT | REVERSE     PARTITION | GLOBAL PARTITION<partition_setting>

使用USER_IND_COLUMNS查詢某個TABLE中的相應字段索引建立情況

使用DBA_INDEXES/USER_INDEXES查詢所有索引的具體設置情況。

在Oracle中的索引可以分為:B樹索引、位圖索引、反向鍵索引、基於函數的索引、簇索引、全局索引、局部索引等,下面逐一講解:

一、B樹索引:

最常用的索引,各葉子節點中包括的數據有索引列的值和數據表中對應行的ROWID,簡單的說,在B樹索引中,是通過在索引中保存排過續的索引列值與相對應記錄的ROWID來實現快速查詢的目的。其邏輯結構如圖:

可以保證無論用戶要搜索哪個分支的葉子結點,都需要經過相同的索引層次,即都需要相同的I/O次數。

B樹索引的創建示例:

create index ind_t on t1(id) ;

注1:索引的針對字段創建的,相同字段不能創建一個以上的索引;

注2:默認的索引是不唯一的,但是也可以加上unique,表示該索引的字段上沒有重復值(定義unique約束時會自動創建);

注3:創建主鍵時,默認在主鍵上創建了B樹索引,因此不能再在主鍵上創建索引。

二、位圖索引:

有些字段中使用B樹索引的效率仍然不高,例如性別的字段中,只有“男、女”兩個值,則即便使用了B樹索引,在進行檢索時也將返回接近一半的記錄。

所以當字段的基數很低時,需要使用位圖索引。(“低”的標准是取值數量 < 行數*1%)

位圖索引的邏輯結構如上圖所示:索引中不再記錄rowid和鍵值,而是將每個值作為一列,用0和1表示該行是否等於該鍵值(0表示否;1表示是)。其中位圖索引的行順序與原表的行順序一致,可以在查詢數據的過程中對應計算出行的原始物理位置。

位圖索引的創建示例:

create bitmap index ind_t on t1(type);

注:位圖索引不可能是唯一索引,也不能進行鍵值壓縮。

三、反向鍵索引:

考慮這個情況:某一字段的值是1-1000順序排列,建立B樹索引后依舊遞增,到后來該B數索引不斷在后面增加分支,會形成如下如的不對稱樹:

反向鍵索引是一種特殊的B樹索引,在存儲構造中與B樹索引完全相同,但是針對數值時,反向鍵索引會先反向每個鍵值的字節,然后對反向后的新數據進行索引。例如輸入2008則轉換為8002,這樣當數值一次增加時,其反向鍵在大小中的分布仍然是比較平均的。

反向鍵索引的創建示例:

create index ind_t on t1(id) reverse;

注:鍵的反轉由系統自行完成。對於用戶是透明的。

四、基於函數的索引:

有的時候,需要進行如下查詢:select * from t1 where to_char(date,'yyyy')>'2007';

但是即便在date字段上建立了索引,還是不得不進行全表掃描。在這種情況下,可以使用基於函數的索引。其創建語法如下:

create index ind_t on t1(to_char(date,'yyyy'));

注:簡單來說,基於函數的索引,就是將查詢要用到的表達式作為索引項。

五、全局索引和局部索引:

這個索引貌似很復雜,其實很簡單。總得來說一句話,就是無論怎么分區,都是為了方便管理。

具體索引和表的關系有三種:

1、局部分區索引:分區索引和分區表1對1

2、全局分區索引:分區索引和分區表N對N

3、全局非分區索引:非分區索引和分區表1對N

創建示例:

首先創建一個分區表

create table student

(

stuno number(5),

sname vrvhar2(10),

deptno number(5)

)

partition by hash (deptno)

(

partition part_01 tablespace A1,

partition part_02 tablespace A2

);

創建局部分區索引(1v1):

create index ind_t on student(stuno)

local(

partition part_01 tablespace A2,

partition part_02 tablespace A1

); --local后面可以不加

創建全局分區索引(NvN):

create index ind_t on student(stuno)

global partition by range(stuno)

(

partition p1 values less than(1000) tablespace A1,

partition p2 values less than(maxvalue) tablespace A2

); --只可以進行range分區

創建全局非分區索引(1vN)

create index ind_t on student(stuno) GLOBAL;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM