`
liqita
  • 浏览: 289777 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL联合索引 与 单一列的索引

阅读更多

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

 

联合索引使用结论:

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

 

 

分享到:
评论
1 楼 xiaokanrensheng87 2015-03-03  
对第四种情况有疑问:–条件列在first_name和last_name中间加入另外一个条件主键id,这个情况我在DB2上试了下,结果是在以主键id为索引的情况下,走的是id的索引,没有走联合索引。而把中间的条件换成其他过滤性不强的字段如cmType,则是走的联合索引。

相关推荐

    数据库SQL教学视频百度云链接

    根据提供的文件信息,我们可以深入探讨与“数据库SQL基础教学视频”相关的重要知识点。这不仅包括对SQL的基础理解,还涉及如何有效地使用SQL进行数据管理、查询优化等方面的内容。 ### SQL基础知识 #### 1. SQL...

    sql存储过程PPT

    1. 简化复杂查询:对多个表的联合查询可以通过视图简化为单一查询。 2. 数据隐藏和权限控制:可以限制用户对基础表的直接访问,只允许他们通过视图来操作数据。 3. 数据抽象:视图可以展现特定的数据子集,提供业务...

    SQL2000数据库的优化及安全

    3. **优化索引与查询**:根据查询条件创建和优化索引,特别注意填充因子的设置,以及避免在值域有限的字段上创建单一索引。 4. **增强网络基础设施**:升级网络设备,缩短数据传输时间。 5. **内存优化**:增加...

    SQL Server数据库查询速度慢原因及优化方法

    索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段。 5、提高网速。 6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。 配置...

    MySQL-2.docx

    联合索引是MySQL中提升查询性能的重要手段,它由多个列组成,允许在多个列上创建单一的索引。这样做的目的是减少索引的数量,降低磁盘空间占用,并提高增删改操作的性能。例如,在学生成绩表中,为了快速查找特定...

    SQLserver数据库优化.pdf

    联合索引需注意,只有当查询条件包含索引中的首个字段时,系统才会使用该索引。对于临时表,大数据量情况下建立索引能提升查询效率,但创建索引也可能使查询速度变慢。 查询速度慢可能由多种原因造成,如缺乏索引或...

    SQL数据库详细知识点课件

    4. **查询操作**:核心的SELECT语句,包括选择列、连接表、分组与聚合、排序、子查询以及联合查询等。学会编写复杂的SELECT语句是SQL应用的关键。 5. **数据插入与更新**:INSERT语句用于向表中添加新记录,UPDATE...

    SQLserver数据库优化[归类].pdf

    - 使用字节数小的列创建索引,避免在有限值的字段上创建单一索引。 - 提升网络速度,扩大服务器内存,根据需要配置虚拟内存。 - 增加服务器CPU数量,但要注意并行处理可能需要更多资源。 - 对于`LIKE`查询,全文...

    SQL查询语言技术

    从基础语法到复杂查询,从单一表操作到多表联合,每一个环节都是掌握SQL的关键。只有通过实际操作,才能真正掌握这个强大的数据处理工具。因此,提供的"SQL查询语言技术"资源将是学习和提升SQL技能的宝贵材料。

    Navicat for MySQL平台中的SQL语言分析与应用.pdf

    该软件不仅支持单一程序,还能够与MySQL数据库进行连接,为数据库管理和开发提供强大的支持。Navicat for MySQL能够提供一个直观的图形界面,以帮助用户完成数据库设计、查询、维护等复杂任务。 4. SQL查询语言在...

    SQL语法大全

    2. ASP与SQL数据库连接: dim conn set conn=server.createobject("ADODB.connection") con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称 %&gt; 建立...

    21天学通SQL

    学会如何使用JOIN操作将来自不同表的数据合并为单一结果集,是高级SQL技能的重要组成部分。了解等值联接、不等值联接、外部联接和内部联接的区别,以及如何正确地识别和引用列,对于构建复杂查询和优化性能非常关键...

    SQL中文课件.rar

    3. **SQL04_联合查询.ppt** 联合查询(JOIN)是合并两个或更多表中的数据的方法。这涉及到INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN等不同类型的联接,它们根据匹配条件的不同,返回不同的结果集。联合查询在...

    微软SQL2005精编培训

    #### 四、SQL联合查询数据、多表查询数据 这部分介绍了如何使用联合查询和多表查询来从多个表中检索数据。 ##### 4.1 LEFT…JOIN…ON - `LEFT JOIN`会返回左表的所有记录以及右表中匹配的记录。 - 如果右表中没有...

    4汽车服务企业信息化管理基础4关系数据库语言SQL.pptx

    - 索引是为了加速查询,分为聚集索引和非聚集索引,前者索引项顺序与表中记录顺序一致,后者则不一定。 查询是SQL的核心,主要包含以下类型: 1. 基本查询:选择特定列的记录。 2. 列列表达式:使用算术运算符、...

    SQL21天自学通

    表的联合允许从多个表中检索数据,并将结果合并为单一的结果集。子查询则是在一个查询语句中包含另一个查询语句,可以用于复杂的数据过滤和分析。 #### 数据操作与表管理 除了查询数据,SQL还提供了强大的数据操作...

    程序员的SQL金典.pdf 高清 下载

    它可以是一个单一的列,也可以是由多个列组成的复合键。主键的主要作用是确保表中记录的唯一性。 **1.2.7 索引(Index)** 索引类似于图书的目录,可以帮助数据库更快地检索数据。创建索引可以提高查询性能,但会...

    sql中设置联合主键的具体方法

    通常,一个表可以有一个单一的主键列,但有时候为了确保数据的唯一性,我们可能需要多个列的组合来作为主键,这种情况下,我们就需要用到联合主键(Composite Primary Key)。联合主键是由两个或更多个列共同组成的...

Global site tag (gtag.js) - Google Analytics