關於SQL 資料庫表中的聚集索引和非聚集索引等

2022-02-19 06:44:28 字數 4729 閱讀 4170

sql資料結構

sql server

搜尋引擎

全文檢索

今天看sql方面的書,看到關於 表索引方面的講解不太詳細,弄的一頭霧水,似懂非懂,特別是聚集索引和非聚集索引。深知索引對提高資料庫查詢速度的重要性,所以就花了半個下午的時間在網上google了一些這方面的文章看了一下,總算對索引有了較深的認識,其實多數文章都寫的不錯,只是介紹的不太全面。這裡把幾篇文章的內容做了綜合,從概念、性質、sql語法和內部實現機制對資料庫表索引做乙個相對全面一點的解釋,一來加深自己對資料庫表索引的理解,二來方便大家參考,錯誤和疏漏之處還請不吝指教。

廢話少說,開始正文————

1.概念

索引是在資料庫表或者檢視上建立的物件,目的是為了加快對錶或檢視的查詢的速度(簡單理解)。

索引是乙個單獨的、物理的資料庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單(深刻理解)。

按照儲存方式分為:聚集與非聚集索引(需要重視和區別的概念,後面詳解)

按照維護與管理索引角度分為:唯一索引、復合索引和系統自動建立的索引(相對簡單,如下解釋:)

1).唯一索引:惟一索引可以確保索引列不包含重複的值.

可以用多個列,但是索引可以確保索引列中每個值組合都是唯一的,

即下面的姓不能有重複,同時名也不能有重複:

姓      名

李      二

張      三

王      五

語法: create unique index idxempid on emp(姓,名)

2).復合索引:如果在兩上以上的列上建立乙個索引,則稱為復合索引。

那麼,不可能有兩行的姓和名是重複的,即上面的表沒有兩行其姓和名的組合是一樣的。

語法: create index indxfullname on emp(姓,名)

3).系統自建的索引:在使用t_sql語句建立表的時候使用primary key或unique約束時,會在表上

自動建立乙個惟一索引,自動建立的索引是無法刪除的。

語法:create table abc

( empid int primary key,

firstname varchar(50) unique,

lastname  varchar(50) unique,

)    /*這樣的結果就出來了三個索引,但只有乙個聚集索引empid*/

聚集索引和非聚集索引——

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

我們把這種正文內容本身就是一種按照一定規則排列的目錄稱為「聚集索引」。

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

我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為「非聚集索引」。

2.性質及使用方法

1)聚集索引:表中儲存的資料按照索引的順序儲存,檢索效率比普通索引高,索引占用硬碟

儲存空間小(1%左右),但對資料新增/修改/刪除的速度影響比較大(降低)。

特點:(1) 無索引,資料無序

(2) 有索引,資料與索引同序

(3) 資料會根據索引鍵的順序重新排列資料

(4) 乙個表只能有乙個索引

(5) 葉節點的指標指向的資料也在同一位置儲存

語法:create clustered index idxempid on emp(empid)

2)非聚集索引:不影響表中的資料儲存順序,檢索效率比聚集索引低,索引占用硬碟儲存

空間大(30%~40%),對資料新增/修改/刪除的影響很少。

特點:(1) 乙個表可以最多可以建立249個非聚集索引

(2) 先建聚集索引才能建立非聚集索引

(3) 非聚集索引資料與索引不同序

(4) 資料與非聚集索引在不同位置

(5) 非聚集索引在葉節點上儲存,在葉節點上有乙個「指標」直接指向要查詢的資料區域

(6) 資料不會根據非聚集索引鍵的順序重新排列資料

語法:create nonclustered index idximpid on emp(empid)

建立索引的方法:

1)企業管理器中

(1)右擊某個表,所有任務---管理索引,開啟管理索引,單擊「新建」就可以建立索引

(2)在設計表中進行設計表,管理索引/鍵

(3)在關係圖中,新增表後右擊關係圖中的某個表,就有「索引/鍵」

(4)通過嚮導,資料庫---建立索引嚮導

(5)通過t-sql語句

2)能過「索引優化嚮導」來優化索引的嚮導,通過它可以決定選擇哪些列做為索引列

何時應使用聚集索引或非聚集索引

動作描述

使用聚集索引

使用非聚集索引

3.資料庫引擎中索引的內部結構

有必要先說明一下資料庫引擎,

這部分是較深的內容,需要有一定的資料庫理論知識和資料結構與演算法知識,資料結構和演算法告訴我們,對索引關鍵字進行快速查詢時要使用樹形資料結構,在資料庫引擎中,索引通常用b+樹來表示,google發現這方面的文章較少,後面找到相關詳細資料會補充。

4.主鍵、索引、聚集索引和非聚集索引

1)主鍵   (pk)  

唯一標識表中的所有行的乙個列或一組列。主鍵不允許空值。不能存在具有相同的主鍵值的兩個

行,因此主鍵值總是唯一標識單個行。表中可以有不止乙個鍵唯一標識行,每個鍵都稱作候選鍵。只有

乙個候選鍵可以選作表的主鍵,所有其它候選鍵稱作備用鍵。儘管表不要求具有主鍵,但定義主鍵是很

好的做法。   在規範化的表中,每行中的所有資料值都完全依賴於主鍵。例如,在以   employeeid   作為

主鍵的規範化的   employee   表中,所有列都應包含與某個特定職員相關的資料。該錶不具有  

departmentname 列,因為部門的名稱依賴於部門   id,而不是職員   id。  

2)索引  

關聯式資料庫中基於鍵值提供對錶的行中資料的快速訪問的資料庫物件。索引還可以在表的行上強制唯

一性。sql   server   支援聚集索引和非聚集索引。對錶的主鍵自動進行索引。在全文搜尋中,全文索引

儲存關於重要詞和這些詞在給定列中的位置的資訊。  

如果某列有多行包含   null   值,則不能在該列上建立唯一索引。同樣,如果列的組合中有多行包

含   null   值,則不能在多個列上建立唯一索引。在建立索引時,這些被視為重複的值。  

3)聚集索引  

在建立聚集索引時,將會對錶進行複製,對錶中的資料進行排序,然後刪除原始的表。因此,資料庫

上必須有足夠的空閒空間,以容納資料複本。預設情況下,表中的資料在建立索引時排序。但是,如果

因聚集索引已經存在,且正在使用同一名稱和列重新建立,而資料已經排序,則會重建索引,而不是從

頭建立該索引,以自動跳過排序操作。重建操作會檢查行是否在生成索引時進行了排序。如果有任何行

排序不正確,即會取消操作,不建立索引。  

4)非聚集索引  

非聚集索引與課本中的索引類似。資料儲存在乙個地方,索引儲存在另乙個地方,索引帶有指標指向

資料的儲存位置。索引中的專案按索引鍵值的順序儲存,而表中的資訊按另一種順序儲存(這可以由聚

集索引規定)。如果在表中未建立聚集索引,則無法保證這些行具有任何特定的順序。

開啟設計表介面裡面有個鑰匙就是主鍵的意思,當你宣告一列為主鍵的時候資料庫實際上就是生成乙個

唯一的索引,查詢優化器實際上是根據列上有沒有唯一索引來保證列的唯一性而不是根據列是否被宣告為主鍵。  

聚集索引乙個表只有乙個,實際上它的葉子節點就是資料頁,比非聚集索引速度快,占用的空間小,大概只有表的1%左右。如果在宣告的時候沒有選擇unique選項,則在插入資料的時候會自動生成乙個唯一標示符。  

非聚集索引乙個表可以有多個,乙個3層的非聚簇索引要查詢6次才可以找到真實資料,因為其葉子節點並不是真實資料,而是標識(如果表上有聚集索引則為聚集索引,如沒有,則為實際資料的頁號),非聚集索引通常占用空間比較大,表的30-40%。 

資料庫索引(聚集與非聚集)

mysql官方對索引的定義為 索引 index 是幫助mysql高效獲取資料的資料結構 索引是用來對資料表中的乙個列或多個列進行排序的資料結構,在這裡資料庫用的平衡樹,b tree和b tree 平衡多路查詢樹 例如 select from table1 where id 10000如果沒有索引,那...

MySql資料庫索引 聚集索引 聯合索引

通過建立索引可以有效的提高查詢效能。索引也分為很多種 聚集 非聚集 聯合索引等 資料結構主要有雜湊索引和b 樹等,雜湊索引在單個查詢效能上很強大,但不適合做範圍查詢。以下討論主要是建立在b 樹索引上面的。索引一般採用b 樹的資料結構,b 樹是乙個有序的樹形結構,每個父節點可以有多個子節點,子節點之間...

SQL中主鍵,聚集索引,非聚集索引的區別

主鍵 主鍵是表中通常有唯一標誌著表中的每一行的值的一列或者多列,它的值用於唯一地標識表中的某一條記錄,用於強制表的實體完整性。主鍵用來乙個表引用來自其他表的特定記錄,主鍵是一種唯一關鍵字,表定義的一部分。可以理解為乙個記錄行的標識。我們通過這個標識,就能精確把這行記錄找出來,它在表中是唯一的 聚集索...