聚集索引和非聚集索引的區別,何時建立索引

2021-07-14 20:03:33 字數 3053 閱讀 2229

use test

go   

表  建立

create table aclu   

(   

a int not null,   

b char(10),   

c varchar(10)   

)   

go   

插入資料

insert into aclu   

select 1,'b','c'   

union   

select 5,'b','c'   

union   

select 7,'b','c'   

union   

select 9,'b','c'   

go  

建立聚集索引

create clustered index clu_abc   

on aclu(a)   

go  

sp_helpindex aclu 

insert into aclu  

values(3,'b','c')

select * from aclu  

建立非聚集索引

drop index aclu.clu_abc 

create nonclustered index nonclu_abc   

on aclu(a)   

insert into aclu

values(6,'b','c') 

結論:ab        c

1b         c

3b         c

5b         c

7b         c

9b         c

6b         c

聚集索引插入3,按順序

非聚集索引插入6,不按順序

其實,我們的漢語字典的正文本身就是乙個聚集索引。

比如,我們要查「安」字,就會很自然地翻開字典的前幾頁,因為「安」的拼音是「an」,而按照拼音排序漢字的字典是以英文本母「a」開頭並以「z」結尾的,那麼「安」字就自然地排在字典的前部。如果您翻完了所有以「a」開頭的部分仍然找不到這個字,那麼就說明您的字典中沒有這個字;同樣的,如果查「張」字,那您也會將您的字典翻到最後部分,因為「張」的拼音是「zhang」。也就是說,字典的正文部分本身就是乙個目錄,您不需要再去查其他目錄來找到您需要找的內容。我們把這種正文內容本身就是一種按照一定規則排列的目錄稱為「聚集索引」。

如果您認識某個字,您可以快速地從自動中查到這個字。但您也可能會遇到您不認識的字,不知道它的發音,這時候,您就不能按照剛才的方法找到您要查的字,而需要去根據「偏旁部首」查到您要找的字,然後根據這個字後的頁碼直接翻到某頁來找到您要找的字。但您結合「部首目錄」和「檢字表」而查到的字的排序並不是真正的正文的排序方法,比如您查「張」字,我們可以看到在查部首之後的檢字表中「張」的頁碼是672頁,檢字表中「張」的上面是「馳」字,但頁碼卻是63頁,「張」的下面是「弩」字,頁面是390頁。很顯然,這些字並不是真正的分別位於「張」字的上下方,現在您看到的連續的「馳、張、弩」三字實際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的對映。我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結果,然後再翻到您所需要的頁碼。我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為「非聚集索引」。

聚集索引和非聚集索引的區別

兩者最大的區別在於聚集索引的葉級儲存了資料本身,但非聚集索引葉結點不存在資料記錄,只是乙個指向聚集索引的指標。這就意味著在非聚集索引的所有級別中都包含了聚集索引的指標,聚集索引的大小會直接影響非聚集索引的大小。

如何選擇表的聚集索引

一般可以優先參考如下因素:

1.列資料寬度要小或者叫窄列,比如int就只有4位元組,這個寬度越小越好,因為可以在同樣的空間中儲存更多的索引資料

2.唯一性,雖然聚集索引並沒強制要求列字段是唯一的,但在系統內部會在具備有重複值的列上增加乙個標識位來區分,實際內部還是唯一的,所以盡量選擇重複值很少最好是3.沒有重複值的列,因為sql sever要額外的去維護這些標識

4.靜態的,不易更改的列,很少發生變更最好是從不修改這列的值,因為它也許會引起資料的移動

5.遞增性的,用來避免索引碎片,這樣sql server每次在插入資料的時候都會將新記錄追加在最新一條記錄的後面,不會因此影響之前插入的資料順序。

什麼情況下應不建或少建索引

動作描述

列經常被分組排序

返回某範圍內的資料

乙個或極少不同值

小數目的不同值

大數目的不同值

頻繁更新的列

外來鍵列主鍵列

頻繁修改索引列

使用聚集索引 應

應 不應

應 不應

不應 應

應 不應

使用非聚集索引 應

不應 不應

不應 應

應 應應 應

1.表記錄太少,如果乙個表只有5條記錄,採用索引去訪問記錄的話,那首先需訪問索引表,再通過索引表訪問資料表,一般索引表與資料表不在同乙個資料塊,這種情況下oracle至少要往返讀取資料塊兩次。而不用索引的情況下oracle會將所有的資料一次讀出,處理速度顯然會比用索引快。

2.經常插入、刪除、修改的表,對一些經常處理的業務表應在查詢允許的情況下儘量減少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等業務表。

3.資料重複且分布平均的表字段,假如乙個表有10萬行記錄,有乙個欄位a只有t和f兩種值,且每個值的分布概率大約為50%,那麼對這種表a欄位建索引一般不會提高資料庫的查詢速度。

4.經常和主欄位一塊查詢但主字段索引值比較多的表字段,如gc_dfss(電費實收)表經常按收費序號、戶標識編號、抄表日期、電費發生年月、操作 標誌來具體查詢某一筆收款的情況,如果將所有的字段都建在乙個索引裡那將會增加資料的修改、插入、刪除時間,從實際上分析一筆收款如果按收費序號索引就已 經將記錄減少到只有幾條,如果再按後面的幾個字段索引查詢將對效能不產生太大的影響。

聚集索引 和 非聚集索引區別

一.mysql的索引 mysql中,不同的儲存引擎對索引的實現方式不同,大致說下myisam和innodb兩種儲存引擎。myisam的b tree的葉子節點上的data,並不是資料本身,而是資料存放的位址。主索引和輔助索引沒啥區別,只是主索引中的key一定得是唯一的。這裡的索引都是非聚簇索引。myi...

聚集索引和非聚集索引區別

聚集索引 資料行的物理順序與列值 一般是主鍵那一列 的邏輯順序相同,乙個表只能擁有乙個聚集索引!非聚集索引 該索引中索引的邏輯順序與磁碟上行的物理順序不同乙個表可以擁有多個非聚集索引!非聚集索引可細分成普通索引,唯一索引,全文索引 區別 聚集索引 可以幫助把很大的範圍,迅速減小範圍。但是查詢該記錄,...

聚集索引和非聚集索引的區別

暫且摘錄如下 摘錄1 前者加在不常更新的表,後者加在經常更新的表 摘錄2 使用聚集索引 聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣...