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.mzph.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&…