数据库之联合索引

数据库之联合索引联合索引使用结论:  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标准),也于事无补,要根据表索引情况来优化查询语句,如没有合适的索引可用,则要创建相应索引.

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LSTM模型介绍

    LSTM模型介绍递归神经网络(RNN)人类不会每时每刻都开始思考。当你阅读这篇文章时,你会根据你对之前单词的理解来理解每个单词。你不会忘掉掉所有东西,然后再从头开始思考。你的想法有持久性。传统的神经网络不能做到这一点,这是一个主要的缺点。例如,假设您想要对电影视频中每个点发生的事件进行分类。目前尚传统神经网络无法利用其对电影中先前事件的推理来预测后者。循环神经网络解决了这个问题。它们是带有循环的…

    2025年10月24日
    3
  • CSDN各产品线月度NPS分析报告新鲜出炉【2021年7月】[通俗易懂]

    CSDN各产品线月度NPS分析报告新鲜出炉【2021年7月】[通俗易懂]不知道各位用户大大有没有注意到,最近,咱们CSDN网站很多页面增加了这个功能模块:你愿意向朋友推荐xxx吗?哈哈,聪明的小伙伴们可能已经知道了,它其实就是个简单的满意度调查,学名NPS。那到底什么是NPS呢?且听C菌我慢慢道来。一、什么是NPS?NPS是针对企业良性收益与真实增长所提出的用户忠诚度概念,它是目前最流行的顾客忠诚度分析指标。根据用户的推荐意愿,将用户分为三类:推荐者、被动者、贬损者,推荐者与贬损者是对企业实际的产品口碑有影响的用户,这两部分用户在用户总数中所占百分比之差,就是.

    2022年5月5日
    55
  • intelli idea激活码【最新永久激活】

    (intelli idea激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日
    122
  • 单点登录原理与简单实现(单点登录原理)

    GitHub:https://github.com/sheefee/simple-sso一、单系统登录机制1、http无状态协议  web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系  但这也同时意味着,任何用户都能通…

    2022年4月14日
    40
  • Jupyter 快捷键表(Mac)

    Jupyter 快捷键表(Mac)使用环境 JupyterNoteb 版本 6 4 3Python 版本 3 9 6JupyterNote 好用到飞 可以加注释 标题 图片 但比起 Pycharm 来 没有自动填充和功能提示是不少的缺憾 网寻了好久各种快捷键 并不全 今天时间充裕 在帮助里找到这张表 好实用 分享之

    2025年10月16日
    3
  • linux 中的文本编辑器nano[通俗易懂]

    linux 中的文本编辑器nano[通俗易懂]linux中的文本编辑器nanohttps://blog.csdn.net/junxieshiguan/article/details/84104912导言:在linux中,说起文本编辑器,很

    2022年7月2日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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