天天看點

索引深入淺出(1/10):索引簡介

很多人對索引都沒有一個清晰的認識,對于聚集索引和非聚集索引之間的差別也不是很清楚。如果有人問我索引是什麼,我覺得這個問題有點大,很難在一篇文章裡解釋清楚。是以我決定嘗試寫這一系列文章,用一個簡單的,可以了解的方法解釋索引,盡管網上關于索引的文章有一籮筐那麼多。

簡單來說,索引幫助資料庫引擎使用最小的資源,最高效的找到需要的資料。通過唯一列索引可以保證資料的連貫性,當索引不一定要建在唯一列上。在忙碌的系統裡,通過增加并發操作,可以提高性能。在一個表上建立的各個索引可以滿足不同使用者的請求,但這也是個頭疼的問題。索引儲存在不同的頁,就像資料存在不同的地方,SQL Server要保證它們的一緻性。對表的任何INSERT,UPDATE,DELETE操作,對應的索引頁會執行相同的操作。索引幫助我們提高擷取資料的性能,但對DML操作卻是個麻煩。在DELETE和UPDATE裡,索引會幫助資料庫引擎找到需要修改的記錄。一個表要建多少個索引并沒有訣竅(thrumb rule)。如果你要更好的讀性能,你可以建立更多的索引,如果你要更好DML操作性能,請保持最小數量的索引。

SQL Server支援2類索引:

  • 聚集索引(Clustered Index:CI)
  • 非聚集索引(Non Clustered Index:NCI)

讓我們用現實生活中的例子來了解這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))。

希望這個介紹可以讓你對聚集索引和非聚集索引有了感性的認識。在接下來的文章裡,我們會讨論聚集索引和非聚集索引的更多細節。

參考文章:

http://www.sqlservercentral.com/blogs/practicalsqldba/2012/10/11/sql-server-index-part-1-basics-of-index/

注:此文章為

WoodyTu

學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,請在文章頁面明顯位置給出此文連結!

若您覺得這篇文章還不錯請點選下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!

繼續閱讀