由于前一篇寫的有點匆忙很多地方不是很簡單,這一片再描述一些概念和細節。
首先,我們都知道在數據庫中的存儲分為兩種結構,一是堆;二是B樹。堆的數據是沒有排序也就沒有結構性可言,我們可以簡單理解為沒有索引的表數據就是以堆的形式存在的。與之相對的,索引都是B樹的形式存儲,這樣的話索引中數據是有序排列的。
其次,索引的結構上篇也是講了,我們這里再根據非聚集索引的結構來對比一下聚集索引。
如圖(官方提供的非聚集索引的結構圖):
我們不難看出,上面紅色標注的是非聚集索引,下面是聚集索引或者堆。由這個圖來分析:
1.非聚集索引與聚集索引一樣都是B樹結構。
2.非聚集索引的葉子節點不是數據頁,這樣非聚集索引的葉子節點只包含鍵值和定位符(定位符,存在兩種可能,如果表中有了聚集索引那么定位符就是個直接指向數據所在行的物理指針,如果有聚集索引,那么就是一個指向索引的聚集鍵)
3.與聚集索引不同,非聚集索引本身并不會改變數據頁的存儲模式。
本篇的重點:非聚集索引
非聚集索引包含了索引鍵列,包含列和書簽。書簽的值根據所在表是堆還是聚集索引既可以是RID也可以是聚集索引鍵,我們用兩個圖對比看一下一目了然。
上圖顯示的是非聚集索引在對上的實際結構,可以發現除了索引鍵值外,就是“RID”就是指向數據頁的指針。
上圖是非聚集索引在聚集索引上的結構,可以發現除去索引鍵值外,就是聚集索引鍵,查詢數據時繼續到索引中去尋找數據。
那么非聚集索引的優點:
1、因為在SQL Server中一頁只是8K,頁面空間有限,所以一行所包含的列數越少,它能保存的行就越多。非聚集索引通常不包含表中所有的列,它一般只包含非常少數的列。因此,一個頁上將能包含比表行(所有的列)更多行的非聚集索引。
2、非聚集索引的另一個好處是,它有一個獨立于數據表的結構,所以可以被放置在不同的文件組,使用不同的I/O路徑,這意味著SQL Server可以并行訪問索引和表,使查找更快速。
3、與聚集索引不同的時,一個表中可以有多個非聚集索引增加查詢覆蓋和交叉等等可以提高查詢速度。
通過對聚集和非聚集索引的描述大概了解兩種索引的基本結構和優缺點,下面根據其他人總結的什么情況下建立何種索引的一個常規方式:
使用聚集索引 使用非聚集索引 外鍵列 應 應 主鍵列 應 應 列經常被分組排序 應 應 返回某范圍內的數據 應 不應 小數目的不同值 應 不應 大數目的不同值 不應 應 頻繁更新的列 不應 應 頻繁修改索引列 不應 應 一個或極少不同值 不應 應
總結:
通過對索引的介紹和測試,我們發現索引能大幅提高查詢的效率,但是同樣相應的維護成本和性能消耗也是非常大的,這需要我們根據實際情況進行合理的設計。 當一個查詢被傳到數據引擎時,SQL Server可以通過三種路徑獲取數據來滿足這個查詢。
了解這些基礎概念接下來我們將從實際應用中去解決如何優化、如何合理化使用索引。
新聞熱點
疑難解答