聚集索引和非聚集索引

2022-01-15 00:57:19 字數 2600 閱讀 2337

定義:資料行的物理順序與列值(一般指主鍵)的邏輯順序相同,乙個表中只能擁有乙個聚集索引

第一列的位址表示改行資料在磁碟中的實體地址,後面的是sql裡面用的表裡的列

id是主鍵,建立了聚集索引。

我們查詢id比較靠後的資料,那麼這行資料的位址在磁碟中的實體地址也會比較靠後。由於物理排列方式和聚集索引額順序相同,也就只能對應乙個聚集索引了。

索引的葉子節點就是對應的資料節點mysql的myisam除外,此儲存引擎的聚集索引和非聚集索引只多了個唯一約束,其他沒什麼區別),可以直接獲取到對應的全部列的資料,在查詢方面,聚集索引的速度會更佔優勢

如果不建立索引,系統會自動建立乙個隱含列作為表的聚集索引

1建立表的時候指定主鍵(注意:sql sever預設主鍵為聚集索引,也可以指定為非聚集索引,而mysql裡主鍵就是聚集索引)

create table t1(

id intprimary key,

name nvarchar(

255)

)

2.建立表後新增聚集索引  mysql

alter table table_name add primary key(colum_name)

注意:最好在建立表的時候新增聚集索引,由於聚集索引的物理順序比較特殊,因此如果再在上面建立索引的時候會根據索引列的排列移動全部資料行上面的順序,會非常地耗費時間以及效能。

定義:該索引中索引的邏輯順序與磁碟上行的物理儲存順序不同,乙個表中可以擁有多個非聚集索引。

其實按照定義,處理聚集索引以外的索引都是非聚集索引,只是又會細分一下(普通索引,唯一索引,全文索引),聚集索引類似字典中的偏旁,他結構順序與實際存放順序不一定一致。

非聚集索引的二次查詢問題

非聚集索引葉節點任然是索引節點,只是有乙個指標指向對應的資料塊,此如果使用非聚集索引查詢,而查詢列中包含了其他該索引沒有覆蓋的列,那麼他還要進行第二次的查詢,查詢節點上對應的資料行的資料。

其中有聚集索引(id),非聚集索引index(username)

例:使用以下語句進行查詢,不需要進行二次查詢,直接就可以從非聚集索引的節點裡面獲取到查詢列的資料。

select id, username from t1 where username = '小明'

select username from t1 where username = '

小明'

但是使用以下的語句進行查詢,就需要二次的查詢去獲取原資料行中的score

select username, score

from t1 where username = '

小明'

在sql server裡面查詢效率如下所示,index seek就是索引所花費的時間,key lookup就是二次查詢所花費的時間。可以看的出二次查詢所花費的查詢開銷佔比很大,達到50%。

這篇部落格有乙個簡單示例:

關於何時使用聚集索引,和非聚集索引

分析:乙個表有乙個主鍵,如果這個表之前沒有聚集索引,同時建立主鍵的時候沒有強制指定使用非聚集索引,sql會預設在此字段上               建立乙個聚集索引, 而主鍵都是唯一的,所以就會認為建立聚集索引的字段也需要唯一。

結論:聚集索引可以建立在任何一列你想建立的字段上,實際不能隨便指定,效能上會有影響。

分析:如果未使用unique屬性建立聚集索引,資料庫引擎將向表自動新增乙個四位元組 uniqueifier 列。必要時,資料庫引擎將向行自                 動新增乙個四位元組 uniqueifier 值,使每個鍵唯一。此列和列值供內部使用,使用者不能檢視或訪問。

如果想查詢學分在60-90之間的學生的分數以及姓名,在學分上建立聚集索引是否是最優的呢?

答:否,既然只輸出兩列,我們可以子啊學分以及學生姓名上建立聯合非聚集索引,此時的索引就形成了覆蓋索引,即索引所儲存                 的內容就是最終輸出的資料,這種索引在此比以學分為聚集索引做查詢效能更好。

索引是通過二叉樹的形式進行描述的,我們可以這樣區分聚集與非聚集索引的區別:聚集索引的葉節點就是最終的資料傑斯安,二非聚集索引的葉節點任然是索引節點,但它有乙個指向最終資料的指標。

在有主鍵的表中插入資料,由於主鍵約束的唯一性,所以要保證插入的資料沒有重複。

比較主鍵為聚集索引和非聚集索引的查詢情況

聚集索引:索引節點就是資料頁,索引想檢查主鍵的唯一性,需要遍歷所有資料節點

非聚集索引:上已經包含了主鍵值,所以查詢主鍵唯一性,只需要遍歷所有的索引頁就行(索引的儲存空間比實際資料更少)

所以插入資料時,主鍵上建立非聚集索引比主鍵上建立聚集索引快

聚集索引和非聚集索引

聚集索引和非聚集索引 一 聚集索引和非聚集索引 聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第乙個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其後。聚集索引的缺點是對錶進行修改速度...

聚集索引和非聚集索引

本文引自 一種索引,該索引中鍵值的邏輯順序決定了表中相應行的物理順序。聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣。聚集索引對於那些...

聚集索引和非聚集索引

聚集索引和非聚集索引 1 聚集索引 聚集索引,表中的資料儲存位置,根據索引的排序進行實際儲存,因此效率是相當高的。因為聚集索引決定了表中資料行的儲存位置。乙個表不可能有兩個或以上的聚集索引,如果乙個表中已經有乙個聚集索引,那麼這個表中其他的索引都將是非聚集索引。表排列順序 表記錄的排列順序與索引的排...