一、索引的概念
??????? 索引就是加快檢索表中數據的方法。數據庫的索引類似于書籍的索引。在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。在數據庫中,索引也允許數據庫程序迅速地找到表中的數據,而不必掃描整個數據庫。
二、索引的特點
??? 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變得更加靈活和高效
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
