SQL Server的復合索引學習【轉載】

概要
什么是單一索引,什么又是復合索引呢? 何時新建復合索引,復合索引又需要注意些什么呢?本篇文章主要是對網上一些討論的總結。

一.概念

單一索引是指索引列為一列的情況,即新建索引的語句只實施在一列上。

用戶可以在多個列上建立索引,這種索引叫做復合索引(組合索引)。復合索引的創建方法與創建單一索引的方法完全一樣。但復合索引在數據庫操作期間所需的開銷更小,可以代替多個單一索引。當表的行數遠遠大于索引鍵的數目時,使用這種方式可以明顯加快表的查詢速度。

同時有兩個概念叫做窄索引和寬索引,窄索引是指索引列為1-2列的索引,如果不特殊說明的話一般是指單一索引。寬索引也就是索引列超過2列的索引。

設計索引的一個重要原則就是能用窄索引不用寬索引,因為窄索引往往比組合索引更有效。擁有更多的窄索引,將給優化程序提供更多的選擇余地,這通常有助于提高性能。

二.使用

創建索引?
create index idx1 on table1(col1,col2,col3)??
查詢
select * from table1 where col1= A and col2= B and col3 = C

這時候查詢優化器,不在掃描表了,而是直接的從索引中拿數據,因為索引中有這些數據,這叫覆蓋式查詢,這樣的查詢速度非常快。???

三.注意事項

1.何時是用復合索引
在where條件中字段用索引,如果用多字段就用復合索引。一般在select的字段不要建什么索引(如果是要查詢select col1 ,col2, col3 from mytable,就不需要上面的索引了)。根據where條件建索引是極其重要的一個原則。注意不要過多用索引,否則對表更新的效率有很大的影響,因為在操作表的時候要化大量時間花在創建索引中.

2.對于復合索引,在查詢使用時,最好將條件順序按找索引的順序,這樣效率最高。如:??
? IDX1:create?? index?? idx1?? on?? table1(col2,col3,col5)??
? select?? *?? from?? table1?? where?? col2=A?? and?? col3=B?? and?? col5=D??

如果是"select?? *?? from?? table1?? where?? col3=B?? and?? col2=A?? and?? col5=D"
或者是"select?? *?? from?? table1?? where?? col3=B"將不會使用索引,或者效果不明顯

3.復合索引會替代單一索引么?
很多人認為只要把任何字段加進聚集索引,就能提高查詢速度,也有人感到迷惑:如果把復合的聚集索引字段分開查詢,那么查詢速度會減慢嗎?帶著這個問題,我們來看一下以下的查詢速度(結果集都是25萬條數據):(日期列fariqi首先排在復合聚集索引的起始列,用戶名neibuyonghu排在后列)

IDX1:create?? index?? idx1?? on?? Tgongwen(fariqi,neibuyonghu)??

(1)select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi>'2004-5-5'

查詢速度:2513毫秒

(2)select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi>'2004-5-5' and neibuyonghu='辦公室'

查詢速度:2516毫秒

(3)select gid,fariqi,neibuyonghu,title from Tgongwen
where neibuyonghu='辦公室'

查詢速度:60280毫秒

從以上試驗中,我們可以看到如果僅用聚集索引的起始列作為查詢條件和同時用到復合聚集索引的全部列的查詢速度是幾乎一樣的,甚至比用上全部的復合索引列還要略快(在查詢結果集數目一樣的情況下);而如果僅用復合聚集索引的非起始列作為查詢條件的話,這個索引是不起任何作用的。當然,語句1、2的查詢速度一樣是因為查詢的條目數一樣,如果復合索引的所有列都用上,而且查詢結果少的話,這樣就會形成“索引覆蓋”,因而性能可以達到最優。同時,請記住:無論您是否經常使用聚合索引的其他列,但其前導列一定要是使用最頻繁的列。

[參考: 查詢優化及分頁算法方案 http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]

4.需要在同一列上同時建單一索引和復合索引么?
試驗: sysbase?? 5.0?? 表table1?? 字段:col1,col2,col3??

試驗步驟:??
(1)建立索引idx1?? on?? col1??
? 執行select?? *?? from?? table1?? where?? col1=A???? 使用idx1??
? 執行select?? *?? from?? table1?? where?? col1=A?? and?? col2=B?? 也使用idx1??

(2)刪除索引idx1,然后建立idx2?? on?? (col1,col2)復合索引??
? 執行以上兩個查詢,也都使用idx2??

(3)如果兩個索引idx1,idx2都存在??
? 并不是?? where?? col1='A'用idx1;where?? col1=A?? and?? col2=B? 用idx2。??
? 其查詢優化器使用其中一個以前常用索引。要么都用idx1,要么都用idx2.??
???
由此可見,
(1)對一張表來說,如果有一個復合索引 on?? (col1,col2),就沒有必要同時建立一個單索引 on col1。
(2)如果查詢條件需要,可以在已有單索引?on col1的情況下,添加復合索引on?? (col1,col2),對于效率有一定的提高。
(3)同時建立多字段(包含5、6個字段)的復合索引沒有特別多的好處,相對而言,建立多個窄字段(僅包含一個,或頂多2個字段)的索引可以達到更好的效率和靈活性。



5. 一定需要覆蓋性查詢么?
通常最好不要采用一個強調完全覆蓋查詢的策略。如果Select子句中的所有列都被一個非群集索引覆蓋,優化程序會識別出這一點,并提供很好的性能。不過,這通常會導致索引過寬,并會過度依賴于優化程序使用該策略的可能性。通常,是用數量更多的窄索引,這對于大量查詢來說可以提供更好的性能。

轉載于:https://www.cnblogs.com/firstdream/p/7241368.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391899.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391899.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391899.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode 1423. 可獲得的最大點數(滑動窗口)

幾張卡牌 排成一行,每張卡牌都有一個對應的點數。點數由整數數組 cardPoints 給出。 每次行動,你可以從行的開頭或者末尾拿一張卡牌,最終你必須正好拿 k 張卡牌。 你的點數就是你拿到手中的所有卡牌的點數之和。 給你一個整數數組 cardPoi…

pandas處理excel文件和csv文件

一、csv文件 csv以純文本形式存儲表格數據 pd.read_csv(文件名),可添加參數enginepython,encodinggbk 一般來說,windows系統的默認編碼為gbk,可在cmd窗口通過chcp查看活動頁代碼,936即代表gb2312。 例如我的電腦默認編碼時gb2312&…

tukey檢測_回到數據分析的未來:Tukey真空度的整潔實現

tukey檢測One of John Tukey’s landmark papers, “The Future of Data Analysis”, contains a set of analytical techniques that have gone largely unnoticed, as if they’re hiding in plain sight.John Tukey的標志性論文之一,“ 數據分析的未來 ”&#x…

spring— Spring與Web環境集成

ApplicationContext應用上下文獲取方式 應用上下文對象是通過new ClasspathXmlApplicationContext(spring配置文件) 方式獲取的,但是每次從容器中獲 得Bean時都要編寫new ClasspathXmlApplicationContext(spring配置文件) ,這樣的弊端是配置文件加載多次…

Elasticsearch集群知識筆記

Elasticsearch集群知識筆記 Elasticsearch內部提供了一個rest接口用于查看集群內部的健康狀況: curl -XGET http://localhost:9200/_cluster/healthresponse結果: {"cluster_name": "format-es","status": "green&qu…

Item 14 In public classes, use accessor methods, not public fields

在public類中使用訪問方法,而非公有域 這標題看起來真晦澀。。解釋一下就是,如果類變成public的了--->那就使用getter和setter,不要用public成員。 要注意它的前提,如果是private的class(內部類..)或者p…

子集和與一個整數相等算法_背包問題的一個變體:如何解決Java中的分區相等子集和問題...

子集和與一個整數相等算法by Fabian Terh由Fabian Terh Previously, I wrote about solving the Knapsack Problem (KP) with dynamic programming. You can read about it here.之前,我寫過有關使用動態編程解決背包問題(KP)的文章。 你可以在這里閱讀 。 Today …

matplotlib圖表介紹

Matplotlib 是一個python 的繪圖庫,主要用于生成2D圖表。 常用到的是matplotlib中的pyplot,導入方式import matplotlib.pyplot as plt 一、顯示圖表的模式 1.plt.show() 該方式每次都需要手動show()才能顯示圖表,由于pycharm不支持魔法函數&a…

到2025年將保持不變的熱門流行技術

重點 (Top highlight)I spent a good amount of time interviewing SMEs, data scientists, business analysts, leads & their customers, programmers, data enthusiasts and experts from various domains across the globe to identify & put together a list that…

spring—SpringMVC的請求和響應

SpringMVC的數據響應-數據響應方式 頁面跳轉 直接返回字符串 RequestMapping(value {"/qq"},method {RequestMethod.GET},params {"name"})public String method(){System.out.println("controller");return "success";}<bea…

Maven+eclipse快速入門

1.eclipse下載 在無外網情況下&#xff0c;無法通過eclipse自帶的help-install new software輸入url來獲取maven插件&#xff0c;因此可以用集成了maven插件的免安裝eclipse(百度一下有很多)。 2.jdk下載以及環境變量配置 JDK是向前兼容的&#xff0c;可在Eclipse上選擇編譯器版…

源碼閱讀中的收獲

最近在做短視頻相關的模塊&#xff0c;于是在看 GPUImage 的源碼。其實有一定了解的伙伴一定知道 GPUImage 是通過 addTarget 鏈條的形式添加每一個環節。在對于這樣的設計贊嘆之余&#xff0c;想到了實際開發場景下可以用到的場景&#xff0c;借此分享。 我們的項目中應該有很…

馬爾科夫鏈蒙特卡洛_蒙特卡洛·馬可夫鏈

馬爾科夫鏈蒙特卡洛A Monte Carlo Markov Chain (MCMC) is a model describing a sequence of possible events where the probability of each event depends only on the state attained in the previous event. MCMC have a wide array of applications, the most common of…

PAT乙級1012

題目鏈接 https://pintia.cn/problem-sets/994805260223102976/problems/994805311146147840 題解 就比較簡單&#xff0c;判斷每個數字是哪種情況&#xff0c;然后進行相應的計算即可。 下面的代碼中其實數組是不必要的&#xff0c;每取一個數字就可以直接進行相應計算。 // P…

我如何在昌迪加爾大學中心組織Google Hash Code 2019

by Neeraj Negi由Neeraj Negi 我如何在昌迪加爾大學中心組織Google Hash Code 2019 (How I organized Google Hash Code 2019 at Chandigarh University Hub) This is me !!! Neeraj Negi — Google HashCode Organizer這就是我 &#xff01;&#xff01;&#xff01; Neeraj …

leetcode 665. 非遞減數列(貪心算法)

給你一個長度為 n 的整數數組&#xff0c;請你判斷在 最多 改變 1 個元素的情況下&#xff0c;該數組能否變成一個非遞減數列。 我們是這樣定義一個非遞減數列的&#xff1a; 對于數組中所有的 i (0 < i < n-2)&#xff0c;總滿足 nums[i] < nums[i 1]。 示例 1: …

django基于存儲在前端的token用戶認證

一.前提 首先是這個代碼基于前后端分離的API,我們用了django的framework模塊,幫助我們快速的編寫restful規則的接口 前端token原理: 把(token加密后的字符串,keyname)在登入后發到客戶端,以后客戶端再發請求,會攜帶過來服務端截取(token加密后的字符串,keyname),我們再利用解密…

數據分布策略_有效數據項目的三種策略

數據分布策略Many data science projects do not go into production, why is that? There is no doubt in my mind that data science is an efficient tool with impressive performances. However, a successful data project is also about effectiveness: doing the righ…

cell 各自的高度不同的時候

1, cell 根據文字、圖片等內容&#xff0c;確定自己的高度。每一個cell有自己的高度。 2&#xff0c;tableView 初始化 現實的時候&#xff0c;不是從第一個cell開始顯示&#xff0c;&#xff08;從第二個&#xff1f;&#xff09;&#xff0c;非非正常顯示。 a:cell 的高度問題…

leetcode 978. 最長湍流子數組(滑動窗口)

當 A 的子數組 A[i], A[i1], …, A[j] 滿足下列條件時&#xff0c;我們稱其為湍流子數組&#xff1a; 若 i < k < j&#xff0c;當 k 為奇數時&#xff0c; A[k] > A[k1]&#xff0c;且當 k 為偶數時&#xff0c;A[k] < A[k1]&#xff1b; 或 若 i < k < j&…