(一)深入淺出理解索引結構
實際上,您可以把索引理解為一種特殊的目錄。
sql server提供了兩種索引:
聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。下面,我們舉例來說明一下聚集索引和非聚集索引的區別。
其實,我們的漢語字典的正文本身就是乙個聚集索引。比如,我們要查「安
」字,就會很自然地翻開字典的前幾頁,因為「安
」的拼音是
「an」
,而按照拼音排序漢字的字典是以英文本母
「a」開頭並以
「z」結尾的,那麼「安
」字就自然地排在字典的前部。如果您翻完了所有以
「a」開頭的部分仍然找不到這個字,那麼就說明您的字典中沒有這個字
;同樣的,如果查「張
」字,那您也會將您的字典翻到最後部分,因為「張
」的拼音是
「zhang」
。也就是說,字典的正文部分本身就是乙個目錄,您不需要再去查其他目錄來找到您需要找的內容。
我們把這種正文內容本身就是一種按照一定規則排列的目錄稱為
「聚集索引」。
如果您認識某個字,您可以快速地從自典中查到這個字。但您也可能會遇到您不認識的字,不知道它的發音,這時候,您就不能按照剛才的方法找到您要查的字,而需要去根據
「偏旁部首
」查到您要找的字,然後根據這個字後的頁碼直接翻到某頁來找到您要找的字。但您結合
「部首目錄」和
「檢字表
」而查到的字的排序並不是真正的正文的排序方法,比如您查「張
」字,我們可以看到在查部首之後的檢字表中「張
」的頁碼是
672頁,檢字表中「張
」的上面是「馳
」字,但頁碼卻是
63頁,「張
」的下面是「弩
」字,頁面是
390頁。很顯然,這些字並不是真正的分別位於「張
」字的上下方,現在您看到的連續的
「馳、張、弩
」三字實際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的對映。我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結果,然後再翻到您所需要的頁碼。
我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為
「非聚集索引」。
通過以上例子,我們可以理解到什麼是
「聚集索引」和
「非聚集索引」。
進一步引申一下,我們可以很容易的理解:每個表只能有乙個聚集索引,因為目錄只能按照一種方法進行排序。
(二)何時使用聚集索引或非聚集索引
下面的表總結了何時使用聚集索引或非聚集索引
(很重要)。
動作描述
使用聚集索引
使用非聚集索引
外來鍵列 應
應主鍵列 應
應列經常被分組排序
(order by)應
應 返回某範圍內的資料 應
不應小數目的不同值 應
不應大數目的不同值 不應
應頻繁更新的列 不應
應 頻繁修改索引列 不應
應乙個或極少不同值 不應
不應事實上,我們可以通過前面聚集索引和非聚集索引的定義的例子來理解上表。如:返回某範圍內的資料一項。比如您的某個表有乙個時間列,恰好您把聚合索引建立在了該列,這時您查詢
2023年1
月1日至2023年10
月1日之間的全部資料時,這個速度就將是很快的,因為您的這本字典正文是按日期進行排序的,聚類索引只需要找到要檢索的所有資料中的開頭和結尾資料即可
;而不像非聚集索引,必須先查到目錄中查到每一項資料對應的頁碼,然後再根據頁碼查到具體內容。
深入淺出理解索引
一 深入淺出理解索引結構 實際上,您可以把索引理解為一種特殊的目錄。sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 非簇集索引 下面,我們舉例來說明一下聚集索引和非聚集索引的區別...
深入淺出理解索引結構 2
四 其他書上沒有的索引使用經驗總結 1 用聚合索引比用不是聚合索引的主鍵速度快 下面是例項語句 都是提取 25萬條資料 select gid,fariqi,neibuyonghu,reader,title from tgongwen where fariqi 2004 9 16 3326毫秒 sel...
04 深入淺出索引
索引的常見模型 innodb索引模型 每乙個索引在innodb中都對應一顆b 樹。主鍵索引的葉子結點存的是整行資料 聚簇索引 非主鍵索引的葉子結點儲存的是主鍵值 二級索引 也就是說基於二級索引的查詢會有一次回表。索引維護 b 樹為了維護有序性,在插入新值的時候需要做必要的維護。自增主鍵 每次插入都是...