`
looyo
  • 浏览: 59279 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    数据库索引,到底是什么

    • 数据库索引用于加速查询 ...(1)很适合磁盘存储,能够充分利用局部性原理,磁盘预读; (2)很低的树高度,能够存储大量数据; (3)索引本身占用的内存很小; (4)能够很好的支持单点查询,范围查询,有序性查询;

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

     深入理解T-SQL体系结构,充分利用高级T-SQL查询技术。  本书深入介绍了T-SQL的内部体系结构,揭示了基于集合的查询的强大威力,并包含大量来自专家们的参考和建议。通过本书提供的最佳实践和示例代码,数据库开发...

    SQL语言艺术

    充分利用每次数据库访问 接近DBMS核心 只做必须做的 sQL语句反映业务逻辑 把逻辑放到查询中 一次完成多个更新 慎用自定义函数 简洁的SQL SQL的进攻式编程 精明地使用异常(Exceptions) 3 战术部署:建立索引 找到...

    高级SQL优化(二)

    充分利用索引索引的限制1.索引对不等号和NOT的限制如果WHERE条件中出现!=或者<>,即使该列建立了索引,则该索引也不会被使用;如果不恰当的使用了NOT,则索引也不会被使用。Oracle10g起,在基于CBO的优化器模式下...

    Ix Adder:2个智能存储过程来处理SQL Server中的“缺少索引”-开源

    它利用了SQL Server的“缺少索引”建议,并在自动安装之前对其进行了充分的清理。 IXA平衡了索引的成本/收益,从而在不降低WRITE性能的情况下显着提高了READ性能。 但是要当心:以错误的方式使用时,该毒蛇还会咬住...

    ORACLE数据库优化设计方案

    二、充分利用系统全局区域SGA(SYSTEM GLOBAL AREA) 三、规范与反规范设计数据库 四、合理设计和管理表 五、索引Index的优化设计 六、多CPU和并行查询PQO(Parallel Query Option)方式的利用 七、实施系统资源管理...

    数据库课程设计——图书管理系统.doc

    充分利用计算机的功能实现对读者管理 、书籍管理,借阅管理等自动化控制,将会使图书馆的工作大大减弱。方便友好的图形 界面、简便的操作、完善的数据库管理。将会使得图书馆系统极大限度的应用于现代化 图书管理中...

    Oracle性能优化

    如何充分利用Oracle的核心工具来跟踪、监控、诊断性能;? 高效的数据库逻辑与物理设计、索引设计、事务设计以及API的使用; SQL与PL/SQL调优,包含并行SQL技术的使用;? 最小化排队锁、闩锁、共享内存以及其他...

    Oracle性能优化求生指南

    , 如何充分利用Oracle的核心工具来跟踪、监控、诊断性能;,  高效的数据库逻辑与物理设计、索引设计、事务设计以及API的使用;, SQL与PL/SQL调优,包含并行SQL技术的使用;,  最小化排队锁、闩锁、共享内存...

    浅谈数据库系统优化.docx

    充分利用临时数据表,及建立合理的索引、调整优化SQL语句,等可以减少客户访问数据库的次数,减小CPU的占用时间,提高内存的利用率,减小系统响应时间,缩短用户等待时间等都有很重要的意义。 3)调整内存分配。内存...

    postgresql-9.6.11-1-windows-x64

    同时PostgreSQL是多进程的,而MySQL是线 程的,虽然并发不高时,MySQL处理速度快,但当并发高的时候,对于现在多核的单台机器上,MySQL的总体处理性能不如PostgreSQL,原因是 MySQL的线程无法充分利用CPU的能力。

    计算机信息管理系统设计.doc

    企业的售后服务管理是该企业运用现代化尽量利用企事业现有的软硬 件环境,采用先进的管理系统开发方案,从而达到充分利用现有资源,提高系统开发水 平和应用效果的目的;系统应符合企业售后服务的规定,满足相关人员...

    Active.Server.Pages技术参考辞典

    本书闢有独特的参照索引供您查询资料,可让您依照关键字、分类、物件及连结来查询ASP的内容。 书中第二部份则以简明扼要且採充分举证范例说明的方式,提供您更多的资讯。循序渐进地指引您如何使用ASP物件、ActiveX...

    ASP.NET性能优化八条建议

    1、数据库访问性能优化 A、尽量减少数据库连接,并充分利用每次数据库连接:连接的创建、打开和关闭是有开销的。可以使用连接池 B、合理使用存储过程:存储过程是存储在服务器端的一组预编译的SQL。使用存储过程可以...

    数据库设计准则及方法论.docx

    性能优化策略 1、数据库、表创建方式的优化 在我们设计概念模型时需要结合业务需求,设计出合理的对象关系和优化的模型结构,在设计物理模型时应该充分考虑创建库表基本策略。 建数据的日志方式 No Logging:不能...

    建立一个简单的数据库系统.doc

    2.4数据库应用对象设计 充分利用SQL Server所提供的数据库应用对象支持应用程序的开发,在数据库应用程序中使用存储过程 可以简化客户端程序,提供系统运行效率,并且减少网络信息传输量。视图建立在SQL Server服务器...

Global site tag (gtag.js) - Google Analytics