標籤:
什麼是索引
資料庫索引是對錶的一列或多列的值進行排序的一種結構,索引與表資料的關係類似於目錄與書籍內容的關係。在SQL-Server中存在兩種比較重要的索引,分別為叢集索引與非叢集索引,它們是以B+樹組織儲存的。
為什麼要使用索引
資料查詢是資料庫一項使用非常頻繁的操作,查詢的快慢已成為了衡量系統好壞的一個重要標準,而合理地使用索引可以提高資料檢索效率,改善資料庫效能,加快資料訪問速度。
- 預讀:用估計資訊,去硬碟讀取資料到緩衝。預讀100次,也就是估計將要從硬碟中讀取了100頁資料到緩衝。
- 物理讀:查詢計劃產生好以後,如果緩衝缺少所需要的資料,讓緩衝再次去讀硬碟。物理讀10頁,從硬碟中讀取10頁資料到緩衝。
- 邏輯讀:從緩衝中取出所有資料。邏輯讀100次,也就是從緩衝裡取到100頁資料。
叢集索引
叢集索引確定表中資料的物理順序。叢集索引類似於電話簿,後者按姓氏排列資料。由於叢集索引規定資料在表中的實體儲存體順序,因此一個表只能包含一個叢集索引。但該索引可以包含多個列(複合式索引),就像電話簿按姓氏和名字進行組織一樣。
叢集索引對於那些經常要搜尋範圍值的列特別有效
如果一個表沒有叢集索引,那麼它是以堆的方式儲存,也就是表中的資料沒什麼順序的。否則假如我們為表建立了叢集索引,那麼其儲存是有順序的
叢集索引的最大好處就是能夠根據查詢要求,迅速縮小查詢範圍,避免全表掃描
非叢集索引
其實,我們的漢語字典的本文本身就是一個叢集索引,比如,我們要查"安"字,就會很自然的翻開字典的前幾頁,因為"安"的拼音是"an",而按照拼音排序漢字的字典是以英文字母"a"開頭並以"z"結尾的,那麼"安"子就自然的排在字典的前部。如果您翻完了所有以“a”開頭的部分仍然找不到這個字,那麼就說明您的字典中沒有這個字;同樣的,如果查“張”字,那您也會將您的字典翻到最後部分,因為“張”的拼音是“zhang”。也就是說,字典的本文部分本身就是一個目錄,您不需要再去查其他目錄來找到您需要找的內容。我們把這種本文內容本身就是一種按照一定規則排列的目錄稱為“叢集索引”。
如果您認識某個字,您可以快速的從自動中查到這個字。但您也可能會遇到不認識的字,不知道它的發音,這時候,就不能按照剛才的方法來查字,而需要根據"偏旁部首"來查,我們把這種目錄純粹是目錄,本文純粹是本文的排序方式稱為“非叢集索引”。
SQL SERVER預設是在主鍵上建立叢集索引
一個簡單的例子說明主鍵建立彙總索引的劣勢
(1)僅在主鍵上建立叢集索引,並且不劃分時間段:
Select gid,fariqi,neibuyonghu,title from tgongwen
用時:128470毫秒(即:128秒)
(2)在主鍵上建立叢集索引,在fariq上建立非叢集索引:
select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi> dateadd(day,-90,getdate())
用時:53763毫秒(54秒)
(3)將彙總索引建立在日期列(fariqi)上:
select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi> dateadd(day,-90,getdate())
用時:2423毫秒(2秒)
雖然每條語句提取出來的都是25萬條資料,各種情況的差異卻是巨大的,特別是將叢集索引建立在日期列時的差異。事實上,如果您的資料庫真的有1000 萬容量的話,把主鍵建立在ID列上,就像以上的第1、2種情況,在網頁上的表現就是逾時,根本就無法顯示。這也是我摒棄ID列作為叢集索引的一個最重要的因素。得出以上速度的方法是:在各個select語句前加:
declare @d datetime
set @d=getdate()
並在select語句後加:
select [語句執行花費時間(毫秒)]=datediff(ms,@d,getdate())
SQL SERVER索引