1.數據庫引入了索引
用戶對數據庫最頻繁的操作是進行數據查詢。一般情況下,數據庫在進行查詢操作時需要對整個表進行數據搜索。當表中的數據很多時,搜索數據就需要很長的時間,這就造成了服務器的資源浪費。為了提高檢索數據的能力,數據庫引入了索引機制。
2.有關“索引”的比喻
從某種程度上,可以把數據庫看作一本書,把索引看作書的目錄,通過目錄查找書中的信息,顯然較沒有目錄的書方便、快捷。
3.數據庫索引實際是什麼?(兩部分組成)
索引是一個單獨的、物理的數據庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。
4.索引在表中的角色
一個表的存儲是由兩部分組成的,一部分用來存放表的數據頁面,另一部分存放索引頁面。索引就存放在索引頁面上,
5.索引高效原理
通常,索引頁面相對於數據頁面來說小得多。當進行數據檢索時,系統先搜索索引頁面,從中找到所需數據的指針,再直接通過指針從數據頁面中讀取數據。
6.索引的分類
在SQL Server 的數據庫中按存儲結構的不同將索引分為兩類:簇索引(Clustered Index)和非簇索引(Nonclustered Index)。
(1)簇索引對表的物理數據頁中的數據按列進行排序,然後再重新存儲到磁盤上,即簇索引與數據是混為一體,的它的葉節點中存儲的是實際的數據。由於簇索引對表中的數據一一進行了排序,因此用簇索引查找數據很快。但由於簇索引將表的所有數據完全重新排列了,它所需要的空間也就特別大,大概相當於表中數據所占空間的120% 。表的數據行只能以一種排序方式存儲在磁盤上,所以一個表只能有一個簇索引。
(2)非簇索引具有與表的數據完全分離的結構,使用非簇索引不用將物理數據頁中的數據按列排序。非簇索引的葉節點中存儲了組成非簇索引的關鍵字的值和行定位器。行定位器的結構和存儲內容取決於數據的存儲方式。如果數據是以簇索引方式存儲的,則行定位器中存儲的是簇索引的索引鍵;如果數據不是以簇索引方式存儲的,這種方式又稱為堆存儲方式(Heap Structure),則行定位器存儲的是指向數據行的指針。非簇索引將行定位器按關鍵字的值用一定的方式排序,這個順序與表的行在數據頁中的排序是不匹配的。由於非簇索引使用索引頁存儲因此它比簇索引需要更多的存儲空間且檢索效率較低但一個表只能建一個簇索引,當用戶需要建立多個索引時就需要使用非簇索引了。
小結:Clustered Index 是與物理數據混在一起並對物理數據進重排,就像使用拼音查字典;Unclustered Index 是與物理數據完全分離的,利用額外空間對關鍵字進行重排,就像使用部首查字典。
數據庫索引應用
一、索引的概念
索引就是加快檢索表中數據的方法。數據庫的索引類似於書籍的索引。在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。在數據庫中,索引也允許數據庫程序迅速地找到表中的數據,而不必掃描整個數據庫。
二、索引的特點
1.索引可以加快數據庫的檢索速度
2.索引降低了數據庫插入、修改、刪除等維護任務的速度
3.索引創建在表上,不能創建在視圖上
4.索引既可以直接創建,也可以間接創建
5.可以在優化隱藏中,使用索引
6.使用查詢處理器執行SQL語句,在一個表上,一次只能使用一個索引
7.其他
三、索引的優點
1.創建唯一性索引,保證數據庫表中每一行數據的唯一性
2.大大加快數據的檢索速度,這也是創建索引的最主要的原因
3.加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
4.在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
5.通過使用索引,可以在查詢的過程中使用優化隱藏器,提高系統的性能。
四、索引的缺點
1.創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加
2.索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大
3.當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度
五、索引分類
1.直接創建索引和間接創建索引
直接創建索引: CREATE INDEX mycolumn_index ON mytable (myclumn)
間接創建索引:定義主鍵約束或者唯一性鍵約束,可以間接創建索引
2.普通索引和唯一性索引
普通索引:CREATE INDEX mycolumn_index ON mytable (myclumn)
唯一性索引:保證在索引列中的全部數據是唯一的,對聚簇索引和非聚簇索引都可以使用
CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
3.單個索引和復合索引
單個索引:即非復合索引
復合索引:又叫組合索引,在索引建立語句中同時包含多個字段名,最多16個字段
CREATE INDEX name_index ON username(firstname,lastname)
4.聚簇索引和非聚簇索引(聚集索引,群集索引)
聚簇索引:物理索引,與基表的物理順序相同,數據值的順序總是按照順序排列
CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH
ALLOW_DUP_ROW(允許有重復記錄的聚簇索引)
非聚簇索引:CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)
六、索引的使用
1.當字段數據更新頻率較低,查詢使用頻率較高並且存在大量重復值是建議使用聚簇索引
2.經常同時存取多列,且每列都含有重復值可考慮建立組合索引
3.復合索引的前導列一定好控制好,否則無法起到索引的效果。如果查詢時前導列不在查詢條件中則該復合索引不會被使用。前導列一定是使用最頻繁的列
4.多表操作在被實際執行前,查詢優化器會根據連接條件,列出幾組可能的連接方案並從中找出系統開銷最小的最佳方案。連接條件要充份考慮帶有索引的表、行數多的表;內外表的選擇可由公式:外層表中的匹配行數*內層表中每一次查找的次數確定,乘積最小為最佳方案
5.where子句中對列的任何操作結果都是在sql運行時逐列計算得到的,因此它不得不進行表搜索,而沒有使用該列上面的索引;如果這些結果在查詢編譯時就能得到,那麼就可以被sql優化器優化,使用索引,避免表搜索(例:select * from record where substring(card_no,1,4)=’5378’
&& select * from record where card_no like ’5378%’)任何對列的操作都將導致表掃描,它包括數據庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊
6.where條件中的’in’在邏輯上相當於’or’,所以語法分析器會將in (’0′,’1′)轉化為column=’0′ or column=’1′來執行。我們期望它會根據每個or子句分別查找,再將結果相加,這樣可以利用column上的索引;但實際上它卻采用了"or策略",即先取出滿足每個or子句的行,存入臨時數據庫的工作表中,再建立唯一索引以去掉重復行,最後從這個臨時表中計算結果。因此,實際過程沒有利用column上索引,並且完成時間還要受tempdb數據庫性能的影響。in、or子句常會使用工作表,使索引失效;如果不產生大量重復值,可以考慮把子句拆開;拆開的子句中應該包含索引
7.要善於使用存儲過程,它使sql變得更加靈活和高效。