数据库之联合索引

数据库之联合索引联合索引使用结论:  1):查询条件中出现联合索引第一列,或者全部,则能利用联合索引.  2):条件列中只要条件相连在一起,以本文例子来说就是:  last_name=’1′andfirst_name=’1′  与  first_name=’1′andlast_name=’1′  ,无论前后,都会利用上联合索引.  3):查询条件中没有出现

大家好,又见面了,我是你们的朋友全栈君。



联合索引使用结论:

   1):查询条件中出现联合索引第一列,或者全部,则能利用联合索引.

   2):条件列中只要条件相连在一起,以本文例子来说就是:

   last_name=’1′ and first_name=’1′

   与

   first_name=’1′ and last_name=’1′

   ,无论前后,都会利用上联合索引.

   3):查询条件中没有出现联合索引的第一列,而出现联合索引的第二列,或者第三列,都不会利用联合索引查询.

 

单一列索引的应用结论:

   1):只要条件列中出现索引列,无论在什么位置,都能利用索引查询.

 

两者的共同点:

   1):要想利用索引,都要符合SARG标准.

   2) :都是为了提高查询速度.

   3):都需要额外的系统开销,磁盘空间.

   补充说明: stmtText信息来产生,在查询语句前面加上:SET STATISTICS PROFILE on.可以通过运行它,来观察你的查询是否合理,这样才能真正做到优化.

 

本文主旨:讨论什么情况下能利用上索引.

   索引:创建索引可以根据查询业务的不同分为两种:单一列的索引,联合索引. 顾名思义,单一列索引就是指在表的某一列上创建索引,联合索引是在多个列上联合创建索引.

   优缺点比较:

   1):索引所占用空间:单一列索引相对要小.

   2):索引创建时间:单一列索引相对短.

   3):索引对insert,update,delete的影响程序:单一列索引要相对低.

   4):在多条件查询时,联合索引效率要高.

   索引的使用范围:单一列索引可以出现在where 条件中的任何位置,而联合索引需要按一定的顺序来写.

 

本文所用测试软件环境如下:SQL05   

DEMO:创建一个人员表,包含人员ID,姓名.在人员ID上创建一个聚集索引,在first_name和last_name上创建一个联合

索引.

create table person (id int, last_name varchar(30), first_name varchar(30))

create unique clustered index person_id on person (id)

create index person_name on person (last_name, first_name)

在上例中,id上创建了聚集索引,下面的查询都会用了聚集索引.

   where id=1

   where id>1

   where id<1

   where id between 1 and n

   where id like ’1%’

   where id in(1,2,3…)

说明: id 列出现在条件中的位置并不一定要求第一列,不受位置影响.

   不过下面的查询方式则不会用上聚集索引.

    where person_id +1=n

   where person_id like ‘%5′

    where person_id like ‘%5%’

   where person_id abs(15)

 联合索引列比起单一列索引最大的好处在于,对于多条件的查询它比起单一列索引更加精确.拿上面的人员表来说吧,如果

要查询一个人的全名,只知道first_name是很难马上找到这个人的全名的,如果知道first_name和last_name则会非常容易找到.

 

下面根据不同的条件与输出列顺序说明索引的应用.

第一种情况:–条件和输出列和索引列顺序相同

select last_name,first_name from person where last_name=’1′ and first_name=’1′

stmtText

Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

SEEK:([bdg_web_vaction].[dbo].[person].[last_name]=[@1]

AND [bdg_web_vaction].[dbo].[person].[first_name]=[@2]) ORDERED FORWARD)

   结果:利用person_name联合索引查找

 

第二种情况:–条件列与索引列顺序不同,但输出列相同

select last_name,first_name from person where first_name=’1′ and last_name=’1′

stmtText

Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

SEEK:([bdg_web_vaction].[dbo].[person].[last_name]=[@2] AND [bdg_web_vaction].

[dbo].[person].[first_name]=[@1]) ORDERED FORWARD)

   结果:利用person_name联合索引查找

 

第三种情况:–条件列与输出列与索引列的顺序都不相同

select first_name,last_name from person where first_name=’1′ and last_name=’1′

Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

SEEK:([bdg_web_vaction].[dbo].[person].

 [last_name]=[@2] AND [bdg_web_vaction].[dbo].[person].[first_name]=[@1]) ORDERED FORWARD)

   结果:利用person_name联合索引查找

 

第四种情况:–条件列在first_name和last_name中间加入另外一个条件

SELECT id, first_name,last_name from person where first_name=’1′ AND id=1 and last_name=’1′

   Clustered Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_id]),

SEEK:([bdg_web_vaction].[dbo].[person].[id]=CONVERT_IMPLICIT(int,[@2],0)),

WHERE:([bdg_web_vaction].[dbo].[person].[first_name]=[@1] AND [bdg_web_vaction].[dbo].[person].[las

   结果:不能利用person_name联合索引查找

 

第五种情况:–在输出列中分开first_name和last_name

SELECT first_name,id,last_name from person where first_name=’1′ and last_name=’1′

Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

SEEK:([bdg_web_vaction].[dbo].[person].

[last_name]=[@2] AND [bdg_web_vaction].[dbo].[person].[first_name]=[@1])

ORDERED FORWARD)

   结果:利用person_name联合索引查找

 

第六种情况:条件列没有出现联合索引的第一列

SELECT first_name,id,last_name from person where first_name=’1′

SELECT first_name,last_name from person where first_name=’1′

SELECT last_name ,first_name from person where first_name=’1′

Index Scan(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

   WHERE:([bdg_web_vaction].[dbo].[person].[first_name]=[@1]))

   结果:不能利用person_name联合索引.

 

第七种情况:–条件列出现联合索引的第一列

SELECT first_name,id,last_name from person where last_name=’1′

SELECT first_name,last_name from person where last_name=’1′

SELECT last_name ,first_name from person where last_name=’1′

Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),

SEEK:([bdg_web_vaction].[dbo].[person].[last_name]=[@1]) ORDERED FORWARD)

   结果:利用person_name联合索引查找

 

 

   联合索引使用总结:

   1):查询条件中出现联合索引第一列,或者全部,则能利用联合索引.

   2):条件列中只要条件相连在一起,以本文例子来说就是:

   last_name=’1′ and first_name=’1′

   与

   first_name=’1′ and last_name=’1′

   ,无论前后,都会利用上联合索引.

3):查询条件中没有出现联合索引的第一列,而出现联合索引的第二列,或者第三列,都不会利用联合索引查询.

   单一列索引的应用总结:

   1):只要条件列中出现索引列,无论在什么位置,都能利用索引查询.

   两者的共同点:

   1):要想利用索引,都要符合SARG标准.

   2) :都是为了提高查询速度.

   3):都需要额外的系统开销,磁盘空间.

   补充说明: stmtText信息来产生,在查询语句前面加上:SET STATISTICS PROFILE on.可以通过运行它,来观察你的查询是否合理,这样才能真正做到优化.

 

   总结:即使表上创建了索引,但如果查询语句写的不科学的话(不符合SARG标准),也于事无补,要根据表索引情况来优化查询语句,如没有合适的索引可用,则要创建相应索引.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143725.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结

    IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结IntelliJIDEA使用教程(总目录篇)首先,使用的时候,自己得先在电脑上安装个小乌龟。也就是svn啦。第一步安装小乌龟。如下:具体安装好像没什么具体要求,一路next,就好。如上图箭头所示,在安装TortoiseSVN的时候,默认commandlineclienttools,是不安装的,这里建议勾选上。这个我不确定我当时选没选,不过呢,你给安装…

  • 【JUC】——CurrentHashMap(1.7、1.8)[通俗易懂]

    【JUC】——CurrentHashMap(1.7、1.8)[通俗易懂]一.CurrentHashMap概述笔者曾在《Map——HashMap》一文中提到,HashMap是JavaCollectionFramework的重要成员,也是Map族(如下图所示)中我们最为常用的一种。不过遗憾的是,HashMap不是线程安全的。也就是说,在多线程环境下,操作HashMap会导致各种各样的线程安全问题,比如在HashMap扩容重哈希时出现的死循环问题,脏读问题…

  • 阿基里斯追乌龟的思考,空间,时间,速度非连续

    阿基里斯追乌龟的思考,空间,时间,速度非连续高中的时候才接触和了解,诺阿基里斯追乌龟的悖论,一直萦绕在自己的心头。在上大学的时候,学习了微积分,自己以为自己懂了,但是最近又思考的时候,发现大学里的那种想法还是存在着一些矛盾,自己没有意识到。再度思考,将自己的想法记录下来,如果存在问题,还请多多指教。按照积分将追逐的过程映射为无限级数的和,然后极限求解,但是极限本身就是一个无限接近但是不可到达的过程,因此在我看来…

  • JS简单实现图片上一张下一张操作

    简单实现了js的图片上一张下一张效果,没怎么做css美化单纯就是想记录一下js部分。效果图:嘿嘿,wuli爽妹子镇图!! &lt;!DOCTYPEhtml&gt;&lt;html&gt;&lt;headlang="en"&gt;&lt;metacharset="UTF-8"&gt;&lt;title&gt;幻灯片&lt;/title&

  • eth挖矿显卡的选择_挖矿一般用什么显卡

    eth挖矿显卡的选择_挖矿一般用什么显卡以太坊显卡挖矿指南1.显卡篇挖矿靠显卡核心计算,所以AMD显卡比NVIDA卡更高效。选择AMD卡,要求显卡显存大于2G,推荐购买4G显存显卡.目前市面上可购选择的显卡品牌型号还有速度.蓝宝石-影驰-技嘉-索泰-讯景-微星-迪兰-盈通#显卡型号操作系统挖矿速度驱动版本显卡功耗

  • platform_driver_probe与platform_driver_register的区别[通俗易懂]

    platform_driver_probe与platform_driver_register的区别[通俗易懂]

    PlatformDeviceandDrivers
    我们可以了解Platformbus上面的驱动模型接口:platform_device,platform_driver。和PCI和USB这些大结构的总线不同,虚拟总线Platformbus使用最小结构来集成SOCprocesser上的各种外设,或者各种“legacy”之间的互联。
    Platformdevice
    典型的Platformdevi

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号