很多人對索引都沒有乙個清晰的認識,對於聚集索引和非聚集索引之間的區別也不是很清楚。如果有人問我索引是什麼,我覺得這個問題有點大,很難在一篇文章裡解釋清楚。所以我決定嘗試寫這一系列文章,用乙個簡單的,可以理解的方法解釋索引,儘管網上關於索引的文章有一籮筐那麼多。
簡單來說,索引幫助資料庫引擎使用最小的資源,最高效的找到需要的資料。通過唯一列索引可以保證資料的連貫性,當索引不一定要建在唯一列上。在忙碌的系統裡,通過增加併發操作,可以提高效能。在乙個表上建立的各個索引可以滿足不同使用者的請求,但這也是個頭疼的問題。索引儲存在不同的頁,就像資料存在不同的地方,sql server要保證它們的一致性。對錶的任何insert,update,delete操作,對應的索引頁會執行相同的操作。索引幫助我們提高獲取資料的效能,但對dml操作卻是個麻煩。在delete和update裡,索引會幫助資料庫引擎找到需要修改的記錄。乙個表要建多少個索引並沒有訣竅(thrumb rule)。如果你要更好的讀效能,你可以建立更多的索引,如果你要更好dml操作效能,請保持最小數量的索引。
sql server支援2類索引:
讓我們用現實生活中的例子來理解這2類索引。假設你的鄰居到你家,問你「woody tu」的**號碼。在這種情況下,**本目錄就是個聚集索引。你開啟**本目錄,跳過3/4的頁,假定他的名字應該出現在目錄的最後一部分。在前後翻過幾頁後,你找到了列有「woody tu」名字的頁。現在你就可以把號碼告訴你的鄰居了。看看這裡發生了什麼?當你找到了列有「woody tu」名字的頁時,你就有了你鄰居(客戶端)需要的資訊。
我們再看另乙個情況,你的鄰居到你家,問你「woody tu」的電子郵件位址,而你並不記得。在這個情況下,**本目錄會扮演非聚集索引的角色。你開啟**本目錄,跳過3/4的頁,假定他的名字應該出現在目錄的最後一部分。在前後翻過幾頁後,你找到了列有「woody tu」名字的頁。現在你可以打**給「woody tu」,問下他的電子郵件位址是多少。掛下**後,你可以把他的電子郵件位址交給你的鄰居。看看這裡發生了什麼?當你找到了列有「woody tu」名字的頁時,你並沒有鄰居(客戶端)需要的資訊。你需要去做乙個額外操作(打**)來獲得鄰居(客戶端)需要的資訊。在sql server裡,這個額外操作被稱為書籤/rid查詢(bookmark or rid lookup,注:rid,堆的行識別符號(fileid:pageid:slotnumber))。
希望這個介紹可以讓你對聚集索引和非聚集索引有了感性的認識。在接下來的文章裡,我們會討論聚集索引和非聚集索引的更多細節。
索引深入淺出 1 10 索引簡介
很多人對索引都沒有乙個清晰的認識,對於聚集索引和非聚集索引之間的區別也不是很清楚。如果有人問我索引是什麼,我覺得這個問題有點大,很難在一篇文章裡解釋清楚。所以我決定嘗試寫這一系列文章,用乙個簡單的,可以理解的方法解釋索引,儘管網上關於索引的文章有一籮筐那麼多。簡單來說,索引幫助資料庫引擎使用最小的資...
索引深入淺出 1 10 索引簡介
很多人對索引都沒有乙個清晰的認識,對於聚集索引和非聚集索引之間的區別也不是很清楚。如果有人問我索引是什麼,我覺得這個問題有點大,很難在一篇文章裡解釋清楚。所以我決定嘗試寫這一系列文章,用乙個簡單的,可以理解的方法解釋索引,儘管網上關於索引的文章有一籮筐那麼多。簡單來說,索引幫助資料庫引擎使用最小的資...
深入淺出理解索引
一 深入淺出理解索引結構 實際上,您可以把索引理解為一種特殊的目錄。sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 非簇集索引 下面,我們舉例來說明一下聚集索引和非聚集索引的區別...