聚合索引和非聚合索引

2021-07-31 18:12:16 字數 4206 閱讀 1124

收集點面試常問道的索引問題

1. 什麼是聚合索引(clustered index) / 什麼是非聚合索引(nonclustered index)? 

2. 聚合索引和非聚合索引有什麼區別? 

深入淺出理解索引結構      

實際上,您可以把索引理解為一種特殊的目錄。微軟的sql server提供了兩種索引:聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。下面,我們舉例來說明一下聚集索引和非聚集索引的區別:      

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

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

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

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

通過以上例子,我們可以理解到什麼是"聚集索引"和"非聚集索引"。      

進一步引申一下,我們可以很容易的理解:每個表只能有乙個聚集索引 ,因為目錄只能按照一種方法進行排序。      

(二)何時使用聚集索引或非聚集索引      

下面的表總結了何時使用聚集索引或非聚集索引(很重要)。        

動作描述                        使用聚集索引                       使用非聚集索引     

列經常被分組排序                  應                                             應     

返回某範圍內的資料               應                                           不應        

乙個或極少不同值                 不應                                         不應     

小數目的不同值                      應                                           不應     

大數目的不同值                     不應                                          應     

頻繁更新的列                         不應                                          應     

外來鍵列                                    應                                             應     

主鍵列                                     應                                            應     

頻繁修改索引列                       不應                                         應         

事實上,我們可以通過前面聚集索引和非聚集索引的定義的例子來理解上表。如:返回某範圍內的資料一項。比如您的某個表有乙個時間列,恰好您把聚合索引建立在了該列,這時您查詢2023年1月1日至2023年10月1日之間的全部資料時,這個速度就將是很快的,因為您的這本字典正文是按日期進行排序的,聚類索引只需要找到要檢索的所有資料中的開頭和結尾資料即可;而不像非聚集索引,必須先查到目錄中查到每一項資料對應的頁碼,然後再根據頁碼查到具體內容。      

(三)結合實際,談索引使用的誤區    

理論的目的是應用。雖然我們剛才列出了何時應使用聚集索引或非聚集索引,但在實踐中以上規則卻很容易被忽視或不能根據實際情況進行綜合分析。下面我們將根據在實踐中遇到的實際問題來談一下索引使用的誤區,以便於大家掌握索引建立的方法。      

1、主鍵就是聚集索引      

這種想法是極端錯誤的,是對聚集索引的一種浪費。雖然sql server預設是在主鍵上建立聚集索引的。      

這裡,用聚合索引比用不是聚合索引的主鍵速度快了近1/4。      

2、用聚合索引比用一般的主鍵作order by時速度快,特別是在小資料量情況下     

select gid,fariqi,neibuyonghu,reader,title from tgongwen  order by fariqi 用時:12936      

select gid,fariqi,neibuyonghu,reader,title from tgongwen  order by gid  用時:18843     

這裡,用聚合索引比用一般的主鍵作order by時,速度快了3/10。事實上,如果資料量很小的話,用聚集索引作為排序列要比使用非聚集索引速度快得明顯的多;而資料量如果很大的話,如10萬以上,則二者的速度差別不明顯。      

3、使用聚合索引內的時間段,搜尋時間會按資料佔整個資料表的百分比成比例減少,而無論聚合索引使用了多少個      

select gid,fariqi,neibuyonghu,reader,title from tgongwen  where fariqi>'2004-1-1' 用時:6343毫秒(提取100萬條)     

select gid,fariqi,neibuyonghu,reader,title from tgongwen  where fariqi>'2004-6-6' 用時:3170毫秒(提取50萬條)      

select gid,fariqi,neibuyonghu,reader,title from tgongwen  where fariqi='2004-9-16'  用時:3326毫秒(和上句的結果一模一樣。如果採集的數量一樣,那麼用大於號和等於號是一樣的)      

select gid,fariqi,neibuyonghu,reader,title from tgongwen  where fariqi>'2004-1-1' and fariqi<'2004-6-6' 用時:3280毫秒      

4 、日期列不會因為有分秒的輸入而減慢查詢速度      

下面的例子中,共有100萬條資料,2023年1月1日以後的資料有50萬條,但只有兩個不同的日期,日期精確到日;之前有資料50萬條,有5000個不同的日期,日期精確到秒。      

select gid,fariqi,neibuyonghu,reader,title from tgongwen  where fariqi>'2004-1-1' order by fariqi 用時:6390毫秒      

select gid,fariqi,neibuyonghu,reader,title from tgongwen  where fariqi<'2004-1-1' order by fariqi 用時:6453毫秒     

(五)其他注意事項      

"水可載舟,亦可覆舟",索引也一樣。索引有助於提高檢索效能,但過多或不當的索引也會導致系統低效。因為使用者在表中每加進乙個索引,資料庫就要做更多的工作。過多的索引甚至會導致索引碎片。      

所以說,我們要建立乙個"適當"的索引體系,特別是對聚合索引的建立,更應精益求精,以使您的資料庫能得到高效能的發揮。      

當然,在實踐中,作為乙個盡職的資料庫管理員,您還要多測試一些方案,找出哪種方案效率最高、最為有效。

推薦一篇文章:

聚合索引和非聚合索引簡單介紹

其實,我們的漢語字典的正文本身就是乙個聚集索引。比如,我們要查 安 字,就會很自然地翻開字典的前幾頁,因為 安 的拼音是 an 而按照拼音排序漢字的字典是以英文本母 a 開頭並以 z 結尾的,那麼 安 字就自然地排在字典的前部。如果您翻完了所有以 a 開頭的部分仍然找不到這個字,那麼就說明您的字典中...

mysql 聚合索引

一 建立索引 1.primary key id 2.unique key uid uid task id 查詢 explain select from user task where uid 232 explain select from user task where task id 1454 e...

mysql聚合索引 組合索引

索引 排好序的快速查詢資料結構。在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。下圖就是一種可能的索引方式示例 資料本身之外,資料庫還維護著乙個滿足特定查詢演算法的資料結構,這些...