聚簇索引和非聚簇索引

2021-09-19 10:35:38 字數 1677 閱讀 3669

聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。當表有聚簇索引時,它的資料行實際上存放在索引的葉子節點中。

通常預設都是主鍵,設定了主鍵,系統預設就為你加上了聚簇索引,當然有人說我不想拿主鍵作為聚簇索引,我需要用其他字段作為索引,當然這也是可以的,這就需要你在設定主鍵之前自己手動的先新增上唯一的聚簇索引,然後再設定主鍵,這樣就木有問題啦。通過主鍵建立的b+樹索引的葉子節點中儲存了具體的資料行。在innodb中要建立二級索引,因為二級索引葉子節點儲存的不是指向行的物理位置的指標,而是行的主鍵值。就這意味著二級索引根據索引查詢行儲存引擎需要找到二級索引的葉子節點獲得對應的主鍵值,然後根據這個值去聚簇索引那裡找到對應的行。這裡做了兩次重複的工作:兩次b+樹查詢而不是一次。

它的資料行實際上沒有存放在縮印的葉子節點中。

聚簇索引和非聚簇索引的對比圖:

有待驗證!!!

動手試試:看看**怎麼敲的

建立索引之前選好表物件,假設表明為indextesttable此表中包含三個欄位id,name,uniquecode

為了更快的進行姓名查詢,我們可以在name欄位上新增非聚簇索引;

建立索引的格式如下:

create nonclustered index [index_name【索引名稱】] on [table_name【表名稱】]([column_name1【列名稱】],[column_name2【列名稱】],...);

我們給indextesttable表的name欄位新增乙個非聚簇索引:

create nonclustered index indextesttable_index_name on indextesttable(name);
給indextesttable表的uniquecode欄位新增乙個聚簇索引:

create clustered index indextesttable_index_uniquecode on indextesttable(uniquecode)
以上的**是最簡單最直接設定索引的方式,而通常實際應用中,會有多字段聯合新增索引的情況,這個就需要你根據實際的應用查詢場景,以及在where條件下最常用的查詢字段,例如:在 tablex中你最經常查詢的條件為:

select name,message 

from tablex 

where 1=1

and deptid='003523' 

and limitedcondition='somevalue'

這個時候你就可以 新增乙個基於 deptid 和 limitedcondition 兩個欄位的非聚簇索引,以便於加速查詢速度;

create nonclustered index tablex_index_departid_limitedcondition

on tablex(deptid,limitedcondition);

簡言之,就是需要根據你的實際應用場景,新增有用並且高效的索引;

參考部落格:

聚簇索引和非聚簇索引

一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾 乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以...

聚簇索引和非聚簇索引

一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以存...

聚簇索引和非聚簇索引

一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾 乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以...