原文:怎样才能充分利用SQL索引

背景:目前WEB的普及太快,很多网站都会因为大流量的数据而发生服务器习惯性死机,一个查询语句只能适用于一定的网络环境.没有优化的查询当遇上大数据量时就不适用了.

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

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

优缺点比较:

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

怎样才能充分利用SQL索引的更多相关文章

  1. 充分利用 SQL Server Reporting Services 图表

    最近在查SSRS的一些文章,看到MSDN在有一篇不错的文章,许多图表设置都有说明,共享给大家.. 其中有说明在SSRS中如果去写条件表达写和报表属性中的“自定义代码”,文章相对比较长,需要大家耐心的查 ...

  2. 数据库性能优化:SQL索引

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...

  3. SQL索引一步到位

    以下均非原创,仅供分享.学习!!! SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? S ...

  4. {好文备份}SQL索引一步到位

    SQL索引一步到位(此文章为"数据库性能优化二:数据库表优化"附属文章之一)   SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百 ...

  5. 转载:SQL索引一步到位

    原文: http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文 ...

  6. SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)

    SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭 ...

  7. SQL索引详解

    转自:http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可 ...

  8. 数据库性能优化一:SQL索引一步到位

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...

  9. 软件开发人员真的了解SQL索引吗(索引使用原则)

    原文:软件开发人员真的了解SQL索引吗(索引使用原则) 前两篇文章我总结了一些SQL数据库索引的问题,这篇主要来分析下索引的优缼点,以及如何正确使用索引.       索引的优点:这个显而易见,正确的 ...

随机推荐

  1. 【C语言探索之旅】 开宗明义及第一课:什么是编程?

    内容简介 1.课程大纲 2.第一部分第一课:什么是编程? 3.第一部分第二课预告:工欲善其事,必先利其器 ​ 课程大纲 不知道为什么,一直对C语言有一种很深厚的“情怀”(类似老罗对锤子手机的那种),说 ...

  2. java javaEE javaWEB J2EE程序猿猿程序是脑损伤,终身工作程序猿

    这几天我越来越郁闷.程序员现在很火----特javaEE员. 但我觉得火只是给人们的工作程序员. 原因 javaweb该项目是非常大的.没听过那个码农能单独接到什么项目.仅仅能被人剥削. 有人不信,我 ...

  3. Chapter 1 Securing Your Server and Network(4):使用虚拟服务帐号

    原文:Chapter 1 Securing Your Server and Network(4):使用虚拟服务帐号 原文出处:http://blog.csdn.net/dba_huangzj/arti ...

  4. Android官方技术文档翻译——Gradle 插件用户指南(1-3)

    不知道是什么网络问题,上午一直发不了博客,其它页面基本正常,就是在写博客这里,每次打开都是响应超时.刚才用了VPN,顺便试了一下,竟然能够编辑.想是CDN之类的问题吧. 这次翻译的是Gradle 插件 ...

  5. MongoDB CRUD 基础知识

    建立一个良好的发展环境 环境win8 x64,下载并安装省略.经mongodb 的bin文件夹增加windows的path中,为以后使用方便. c盘新建存储目录:c:/data/db 执行服务:WIN ...

  6. ignore,neglect,omit,overlook

    一:简介——ignore :通常指有意不顾,或不理显而易见的事物.neglect :侧重指有意的忽略或忽视,也可指粗心与疏忽.omit :指有意或无意地忘记做某事,也指删去被视作不重要.不合意的东西. ...

  7. React-Native基础教程

    React-Native牛刀小试仿京东砍啊砍砍到你手软 React-Native基础教程 *React-Native基础篇作者git *React-Native官方文档 *Demo 几个月前faceb ...

  8. Robot Framework 使用1-环境配置及简单网站兼容性测试(转)

    0.Robot Framework 简介 Robot Framework 是一个通用的自动化测试框架,主要用于“验收测试”和“验收测试驱动开发(ATDD)” (会其它文章中会详细介绍ATDD).它使用 ...

  9. 操作系统学习笔记_12_I/O管理 --I/O管理概述

    h1 { margin-bottom: 0.21cm; }h1.western { font-family: "Liberation Sans",sans-serif; font- ...

  10. ubuntu安装jdk eclipse mysql等

    linux ubuntu下安装java web开发环境,需要安装包: jdk7 eclipse(选择java EE developer) apche-tomcat mysql(workbench可视化 ...