資料庫 索引的概念及建立

2021-09-07 06:37:49 字數 3748 閱讀 8560

學習一下索引。索引應該是oracle的初級內容中比較重要的一部分。因為是否建立索引,對sql的查詢效率會有比較大的影響。當然對於何種索引,索引如何工作的原理,基本上只需要了解就可以了,不需要太過於深入,除非以後要做專門的sql調優,否則一般的情況下很少會需要設定索引型別的情況。

什麼是索引:

索引是一種與表有關的資料庫結構,是建立在表的一列或多個列上的輔助物件。使用索引可以有一下好處: 

1、加快查詢速度; 

2、減少i/o操作 

3、消除磁碟排序

索引的建立格式:

create uniuqe | bitmap index .

on .

(| asc | desc, 

| asc | desc,...) 

tablespace

storage

logging | nologging 

compute statistics 

nocompress | compress

nosort | reverse 

partition | global partition

unique | bitmap:指定unique為唯一值索引,bitmap為位圖索引,省略為b-tree索引。 

| asc | desc:可以對多列進行聯合索引,當為expression時即「基於函式的索引」

tablespace:指定存放索引的表空間(索引和原表不在乙個表空間時效率更高) 

storage:可進一步設定表空間的儲存引數 

logging | nologging:是否對索引產生重做日誌(對大表盡量使用nologging來減少占用空間並提高效率) 

compute statistics:建立新索引時收集統計資訊 

nocompress | compress:是否使用「鍵壓縮」(使用鍵壓縮可以刪除乙個鍵列中出現的重複值) 

nosort | reverse:nosort表示與表中相同的順序建立索引,reverse表示相反順序儲存索引值 

partition | nopartition:可以在分割槽表和未分割槽表上對建立的索引進行分割槽

使用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,這樣當數值一次增加時,其反向鍵在大小中的分布仍然是比較平均的。

反向鍵索引的建立示例:

createindex 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

建立示例:

首先建立乙個分割槽表

createtable 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)

globalpartition by range(stuno) (

partition p1 values less than(1000) tablespace a1,

partition p2 values less than(maxvalue) tablespace a2

); --只可以進行range分割槽

建立全域性非分割槽索引(1vn)

createindex ind_t on student(stuno) global;

注:全域性非分割槽索引不能是點陣圖索引,但可以是唯一索引。

講解MySQL索引的概念及資料庫索引的應用

b 1.資料庫引入了索引 b 使用者對資料庫最頻繁的操作是進行資料查詢。一般情況下,資料庫在進行查詢操作時需要對整個表進行資料搜尋。當表中的資料很多時,搜尋資料就需要很長的時間,這就造成了伺服器的資源浪費。為了提高檢索資料的能力,資料庫引入了索引機制。b 2.有關 索引 的比喻 b 從某種程度上,可...

SQL Server索引概念及如何建立索引

最近一直在研究資料庫優化的方案,其中索引是必不可少的部分 什麼是索引 拿漢語字典的目錄頁 索引 打比方 正如漢語字典中的漢字按頁存放一樣,sql server中的資料記錄也是按頁存放的,每頁容量一般為4k 為了加快查詢的速度,漢語字 詞 典一般都有按拼音 筆畫 偏旁部首等排序的目錄 索引 我們可以選...

資料庫事務概念及特性

事務結束於 執行commit或rollback語句 執行一條ddl語句,例如create table語句 在這種情況下,會自動執行commit語句 執行一條dcl語句,例如grant語句,在這種情況下,會自動執行commit語句 斷開與資料庫的連線 執行一條dml語句,該語句卻失敗了,在這種情況下,...