qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          深入淺出理解索引

            (一)深入淺出理解索引結(jié)構(gòu)

            實(shí)際上,您可以把索引理解為一種特殊的目錄。

            SQL SERVER提供了兩種索引:聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。下面,我們舉例來說明一下聚集索引和非聚集索引的區(qū)別。

            其實(shí),我們的漢語字典的正文本身就是一個(gè)聚集索引。比如,我們要查“安”字,就會(huì)很自然地翻開字典的前幾頁,因?yàn)?#8220;安”的拼音是“an”,而按照拼音排序漢字的字典是以英文字母“a”開頭并以“z”結(jié)尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”開頭的部分仍然找不到這個(gè)字,那么就說明您的字典中沒有這個(gè)字;同樣的,如果查“張”字,那您也會(huì)將您的字典翻到最后部分,因?yàn)?#8220;張”的拼音是“zhang”。也就是說,字典的正文部分本身就是一個(gè)目錄,您不需要再去查其他目錄來找到您需要找的內(nèi)容。

            我們把這種正文內(nèi)容本身就是一種按照一定規(guī)則排列的目錄稱為“聚集索引”。

            如果您認(rèn)識(shí)某個(gè)字,您可以快速地從自典中查到這個(gè)字。但您也可能會(huì)遇到您不認(rèn)識(shí)的字,不知道它的發(fā)音,這時(shí)候,您就不能按照剛才的方法找到您要查的字,而需要去根據(jù)“偏旁部首”查到您要找的字,然后根據(jù)這個(gè)字后的頁碼直接翻到某頁來找到您要找的字。但您結(jié)合“部首目錄”和“檢字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“張”字,我們可以看到在查部首之后的檢字表中“張”的頁碼是672頁,檢字表中“張”的上面是“馳”字,但頁碼卻是63頁,“張”的下面是“弩”字,頁面是390頁。很顯然,這些字并不是真正的分別位于“張”字的上下方,現(xiàn)在您看到的連續(xù)的“馳、張、弩”三字實(shí)際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我們可以通過這種方式來找到您所需要的字,但它需要兩個(gè)過程,先找到目錄中的結(jié)果,然后再翻到您所需要的頁碼。

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

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

            進(jìn)一步引申一下,我們可以很容易的理解:每個(gè)表只能有一個(gè)聚集索引,因?yàn)槟夸浿荒馨凑找环N方法進(jìn)行排序。

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

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

          動(dòng)作描述

          使用聚集索引

          使用非聚集索引

          外鍵列

          應(yīng)

          應(yīng)

          主鍵列

          應(yīng)

          應(yīng)

          列經(jīng)常被分組排序(order by)

          應(yīng)

          應(yīng)

          返回某范圍內(nèi)的數(shù)據(jù)

          應(yīng)

          不應(yīng)

          小數(shù)目的不同值

          應(yīng)

          不應(yīng)

          大數(shù)目的不同值

          不應(yīng)

          應(yīng)

          頻繁更新的列

          不應(yīng)

          應(yīng)

          頻繁修改索引列

          不應(yīng)

          應(yīng)

          一個(gè)或極少不同值

          不應(yīng)

          不應(yīng)

            事實(shí)上,我們可以通過前面聚集索引和非聚集索引的定義的例子來理解上表。如:返回某范圍內(nèi)的數(shù)據(jù)一項(xiàng)。比如您的某個(gè)表有一個(gè)時(shí)間列,恰好您把聚合索引建立在了該列,這時(shí)您查詢2004年1月1日至2004年10月1日之間的全部數(shù)據(jù)時(shí),這個(gè)速度就將是很快的,因?yàn)槟倪@本字典正文是按日期進(jìn)行排序的,聚類索引只需要找到要檢索的所有數(shù)據(jù)中的開頭和結(jié)尾數(shù)據(jù)即可;而不像非聚集索引,必須先查到目錄中查到每一項(xiàng)數(shù)據(jù)對應(yīng)的頁碼,然后再根據(jù)頁碼查到具體內(nèi)容。

            聚集索引和非聚集索引深入淺出,希望能幫助您更好的理解兩種索引的區(qū)別,下一篇博客我們談下有關(guān)索引的基本語法結(jié)構(gòu)及維護(hù)。

          posted on 2012-07-31 10:52 順其自然EVO 閱讀(215) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          <2012年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 辽源市| 巴塘县| 清苑县| 闸北区| 铁力市| 浦江县| 全州县| 兴安盟| 汤阴县| 乾安县| 淮南市| 渝北区| 永州市| 油尖旺区| 孝义市| 新昌县| 大冶市| 贵定县| 万盛区| 遵义市| 印江| 酉阳| 开江县| 醴陵市| 浠水县| 鹤岗市| 河间市| 壤塘县| 含山县| 平遥县| 金堂县| 林甸县| 田林县| 尚义县| 松潘县| 兰州市| 前郭尔| 邹平县| 遵义市| 元阳县| 汉阴县|