SQL Server 索引结构及其使用
sql server的left join的using用法-概述说明以及解释

sql server的left join的using用法-概述说明以及解释1.引言1.1 概述:在SQL Server中,LEFT JOIN是一种常用的连接操作,用来在两个表之间建立关联关系,并且保留左表的所有记录。
使用LEFT JOIN可以实现查询主表中的所有数据,即使在关联的从表中没有匹配的记录。
本文将重点介绍LEFT JOIN的Using用法,帮助读者更好地理解如何在SQL Server中使用Using子句进行左连接操作。
通过学习本文,读者将了解到Using用法的语法、特点以及适用场景,从而更好地运用LEFT JOIN来进行数据查询和分析。
1.2文章结构1.2 文章结构:本文将分为三个主要部分来讨论SQL Server中LEFT JOIN的Using 用法。
首先,我们将介绍SQL Server中LEFT JOIN的基本概念,包括LEFT JOIN的定义和与其他类型JOIN的区别。
接着,我们将重点讨论LEFT JOIN 的Using用法,探讨其语法和具体应用场景。
最后,我们将总结LEFT JOIN 的Using用法,提出一些实际应用中的注意事项,并展望其未来发展趋势。
通过本文的阐述,读者将能够全面了解SQL Server中LEFT JOIN的Using 用法及其在数据查询中的重要性和实际应用价值。
1.3 目的在本文中,我们将深入探讨SQL Server中LEFT JOIN的Using用法,通过分析其基本概念、语法结构和使用场景,帮助读者更好地理解和应用LEFT JOIN操作符。
通过学习本文,读者将能够掌握LEFT JOIN的Using 用法,提升对SQL Server的查询操作能力。
此外,我们还将总结实际应用中LEFT JOIN的Using用法的一些注意事项,帮助读者在实际项目中更加灵活、高效地运用LEFT JOIN操作符。
最后,我们还将展望未来LEFT JOIN的发展趋势,帮助读者跟上数据库领域的最新发展动态。
SQL Server 2005_索引

数据库
数据文件 .mdf或.ndf 事务日志文件 .ldf
表
区:64 KB 数据 页:8 KB
数据的查找
数据如何查找
表扫描
使用索引
数据页
Page 4
Con Funk White ... ... ... ... ... ... ...
Page 5
Rudd White Barr
... ... ... ... ... ... ...
Page 6
Akhtar Funk Smith Martin ...
... ... ... ... ...
Page 7
Smith Ota Jones
... ... ... ... ... ... ...
Page 8
Martin Phua Jones Smith ...
... ... ... ... ...
非聚集索引的结构示意图
object_id
根节点 上一页 下一页 索引行 非 索引页 聚 集 叶节点
键值+行定位符
index_id > 1
root_page
索 上一页 下一页 索引行 上一页 下一页 索引行 上一页 下一页 索引行 引
索引页
堆 数据页 或 上一页 下一页 上一页 下一页 聚
……
数据行
INSERT member (last name) VALUES lastname = ‘Jackson' Index Pages
Akhtar … Martin Akhtar Ganio Jackson … Lang Smith …
Non-Leaf Level
Leaf Level Leaf Level
SQLServer创建索引(index)

SQLServer创建索引(index)索引的简介:索引分为聚集索引和⾮聚集索引,数据库中的索引类似于⼀本书的⽬录,在⼀本书中通过⽬录可以快速找到你想要的信息,⽽不需要读完全书。
索引主要⽬的是提⾼了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间。
但是索引对于提⾼查询性能也不是万能的,也不是建⽴越多的索引就越好。
索引建少了,⽤ WHERE ⼦句找数据效率低,不利于查找数据。
索引建多了,不利于新增、修改和删除等操作,因为做这些操作时,SQL SERVER 除了要更新数据表本⾝,还要连带⽴即更新所有的相关索引,⽽且过多的索引也会浪费硬盘空间。
索引的分类:索引就类似于中⽂字典前⾯的⽬录,按照拼⾳或部⾸都可以很快的定位到所要查找的字。
唯⼀索引(UNIQUE):每⼀⾏的索引值都是唯⼀的(创建了唯⼀约束,系统将⾃动创建唯⼀索引)主键索引:当创建表时指定的主键列,会⾃动创建主键索引,并且拥有唯⼀的特性。
聚集索引(CLUSTERED):聚集索引就相当于使⽤字典的拼⾳查找,因为聚集索引存储记录是物理上连续存在的,即拼⾳ a 过了后⾯肯定是 b ⼀样。
⾮聚集索引(NONCLUSTERED):⾮聚集索引就相当于使⽤字典的部⾸查找,⾮聚集索引是逻辑上的连续,物理存储并不连续。
PS:聚集索引⼀个表只能有⼀个,⽽⾮聚集索引⼀个表可以存在多个。
什么情况下使⽤索引:语法:CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_nameON <object> ( column_name [ ASC | DESC ] [ ,...n ] )[ WITH <backward_compatible_index_option> [ ,...n ] ][ ON { filegroup_name | "default" } ]<object> ::={[ database_name. [ owner_name ] . | owner_name. ]table_or_view_name}<backward_compatible_index_option> ::={PAD_INDEX| FILLFACTOR = fillfactor| SORT_IN_TEMPDB| IGNORE_DUP_KEY| STATISTICS_NORECOMPUTE| DROP_EXISTING}参数:UNIQUE:为表或视图创建唯⼀索引。
SQLServer-索引详细教程(聚集索引,非聚集索引)

SQLServer-索引详细教程(聚集索引,⾮聚集索引)作者:(⼀)必读:深⼊浅出理解索引结构实际上,您可以把索引理解为⼀种特殊的⽬录。
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和⾮聚集索引(nonclustered index,也称⾮聚类索引、⾮簇集索引)。
下⾯,我们举例来说明⼀下聚集索引和⾮聚集索引的区别:其实,我们的汉语字典的正⽂本⾝就是⼀个聚集索引。
⽐如,我们要查“安”字,就会很⾃然地翻开字典的前⼏页,因为“安”的拼⾳是“an”,⽽按照拼⾳排序汉字的字典是以英⽂字母“a”开头并以“z”结尾的,那么“安”字就⾃然地排在字典的前部。
如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼⾳是“zhang”。
也就是说,字典的正⽂部分本⾝就是⼀个⽬录,您不需要再去查其他⽬录来找到您需要找的内容。
我们把这种正⽂内容本⾝就是⼀种按照⼀定规则排列的⽬录称为“聚集索引”。
如果您认识某个字,您可以快速地从⾃动中查到这个字。
但您也可能会遇到您不认识的字,不知道它的发⾳,这时候,您就不能按照刚才的⽅法找到您要查的字,⽽需要去根据“偏旁部⾸”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。
但您结合“部⾸⽬录”和“检字表”⽽查到的字的排序并不是真正的正⽂的排序⽅法,⽐如您查“张”字,我们可以看到在查部⾸之后的检字表中“张”的页码是672页,检字表中“张”的上⾯是“驰”字,但页码却是63页,“张”的下⾯是“弩”字,页⾯是390页。
很显然,这些字并不是真正的分别位于“张”字的上下⽅,现在您看到的连续的“驰、张、弩”三字实际上就是他们在⾮聚集索引中的排序,是字典正⽂中的字在⾮聚集索引中的映射。
我们可以通过这种⽅式来找到您所需要的字,但它需要两个过程,先找到⽬录中的结果,然后再翻到您所需要的页码。
sqlserver 空字段 索引

标题:SQL Server中空字段索引的使用及其优化方法目录1. SQL Server中空字段索引的作用2. SQL Server中空字段索引的使用方法3. SQL Server中空字段索引的优化方法一、SQL Server中空字段索引的作用在SQL Server数据库中,索引是一种用于加快数据查询速度的重要技术。
空字段索引是指在数据库表中对某个字段建立的索引,该字段允许为空值。
空字段索引的作用在于提高查询速度、优化数据检索效率,同时对于包含大量空值的字段,可以节约存储空间。
二、SQL Server中空字段索引的使用方法在SQL Server中,可以通过以下步骤对空字段建立索引:1. 分析数据表结构,确定哪些字段允许为空值且需要建立索引。
2. 使用CREATE INDEX语句来创建空字段索引,例如:```sqlCREATE INDEX idx_name ON table_name (column_name);```3. 使用SQL Server Management Studio(SSMS)或其他数据库管理工具来验证空字段索引的创建情况,并进行必要的优化和调整。
三、SQL Server中空字段索引的优化方法在使用空字段索引的过程中,可以通过以下方法来优化其性能:1. 确保索引列的数据类型和长度合理。
索引列的数据类型应尽量选择较小的类型,避免浪费存储空间。
2. 定期对空字段索引进行重新组织或重建。
由于数据的增删改会导致索引碎片化,因此需要定期对索引进行维护,以提高查询性能。
3. 根据业务需求和实际查询情况,合理选择索引类型。
在SQL Server 中,可以使用聚集索引、非聚集索引、覆盖索引等不同类型的索引,根据查询需求来选择最合适的索引类型。
4. 考虑在查询条件中对空字段进行合理的处理。
对于可能涉及到空字段的查询条件,需要针对性地优化查询语句,避免性能损耗。
总结在SQL Server中,空字段索引可以有效提高数据查询的速度和效率,但在使用过程中需要注意合理选择索引列、定期维护索引以及优化查询语句,以达到最佳的性能效果。
sqlserver基本语法

SQL Server基本语法一、SQL Server简介在开始讨论SQL Server基本语法之前,我们先简要介绍一下SQL Server。
SQL Server是由Microsoft开发的关系型数据库管理系统(RDBMS),它是一种可靠、高效且安全的数据库解决方案。
SQL Server支持广泛的企业级应用,并提供了强大的数据管理和查询功能。
二、SQL Server安装在使用SQL Server之前,我们需要先进行安装和配置。
以下是SQL Server安装的一般步骤:1.下载SQL Server安装包,并运行安装程序。
2.选择安装类型(如开发人员、评估版或正式版)。
3.设置安装规则,包括实例名称、安装路径等。
4.配置身份验证方式,可以选择Windows身份验证或SQL Server身份验证。
5.选择要安装的组件,如数据库引擎、分析服务等。
6.进行一些其他配置,如临时数据库路径、自动维护计划等。
7.等待安装完成,并根据需要安装补丁和更新。
三、SQL Server连接安装完成后,我们可以使用SQL Server Management Studio(SSMS)来连接和管理数据库。
以下是连接SQL Server的基本步骤:1.打开SQL Server Management Studio。
2.在连接对话框中输入服务器名称和身份验证方式。
3.如果选择Windows身份验证,直接输入Windows账户信息即可。
4.如果选择SQL Server身份验证,输入用户名和密码。
5.点击“连接”按钮,成功连接到SQL Server。
四、SQL语句基础SQL Server支持使用SQL语句来管理数据库和执行查询操作。
以下是一些常用的SQL语句:1. 创建数据库CREATE DATABASE database_name;使用CREATE DATABASE语句可以创建一个新的数据库,需要指定数据库名称。
2. 创建表CREATE TABLE table_name (column1 datatype,column2 datatype,...);使用CREATE TABLE语句可以创建一个新的表,需要指定表名称和列及其数据类型。
sql索引的建立与使用

sql索引的建立与使用
MySQL索引的建立与使用
MySQL索引是一种用于提高检索速度的工具,提供迅速访问数据
库表中数据的方法。
它是把表中一列或者多列的值作为索引,同时保
存数据表行的地址。
MySQL索引有助于提高检索速度,但可能导致插入,更新和删除操作变慢。
此外,当查询表中大量数据时,索引也能够有
效减少查询时间。
MySQL索引必须使用强类型,即每个值必须是同一类型。
MySQL
索引也可以建立在Text或Blob字段上,但最近访问的字段将被视为
更重要的索引。
MySQL索引的索引类型包括唯一索引,全文索引,复合索引,前缀索引和空索引。
要创建索引,用户首先要知道哪些字段比较重要并且频繁的使用到,这样可以减少查询的时间。
然后在这些字段上添加索引,以节省
查询时间,有助于提高性能。
此外,要小心创建索引。
如果列上创建
了过多的索引,它会影响插入,更新和删除操作的性能。
因此,MySQL索引的建立和使用非常重要,它可以有效减少查询
时间,但要慎重选择要创建的索引和其索引类型。
只有在理解索引索
引以及其各种类型之后,您才能有效地使用它们来实现更低的查询时间,更快速和更有效率的操作。
SqlServer基本常学语法(索性,触发器等都有)

S2_Sql 端口1433第1章1、创建一个数据文件和一个日志文件.create database StuDB--数据裤名称on primary--primary指定是主数据裤文件(name='StuDB_data',--name为数据文件的逻辑称filename='f:\冯建\StuDB_data.mdf',--数据文件的物理名称size=3mb,--数据文件的初始大小maxsize=100mb,--数据文件增长的最大值filegrowth=10%--数据文件的增长率)log on--日志文件,各参数含义同上(name='stuDB_log',filename='f:\冯建\StuDB_log.ldf',size=2mb,filegrowth=1mb)2、删除数据裤..drop database 数据裤名Sql Server 将数据裤的清单存放在master系统数据裤的sysdatabases表中,只需要查看该表中是否存于该数据库中就可以了。
use master--设置当前的数据库为master,以便访问sysdatabases表goif exists(select*from sysdatabases where name='stuDB')drop database stuDBcreate database stuDBon()log on()Exists(查询语句)检测某个查询是否存在。
如果查询语句返回的记录结果不为空,则表示存在;否则表示不存在。
3、创建学员信息表和删除学员信息表--创建学员信息表/*语法carate table 表名(字段 1数据类型列的特征字段2 数据类型列的特征....)*/use stuDBgoif exists(select*from sysobjects where type='u'and name=StuInfo) drop table StuInfo –-删除表的语句create table StuInfo(stuname varchar(20)not null,--学员姓名,非空stuNo char(6)not null,--学号,非空StuID numeric(18,0), --身份证号码,numeric(18,0)代表位数字,小数位数为位stuSeat smallint identity(1,1),--座位号,自动编号(标识列),identity(起始值,递增量)stuAddress text--允许为,住址)4、使用sql语句创建和删除约束添加约束语法:Alter table 表名Add constraint 约束名约束类型具体的约束说明删除约束语法:alter table stuInfodrop constraint 约束名--添加主键约束将stuNO作为主键alter table stuInfoadd constraint PK_stuNo primary key(stuNo)--添加唯一约束(身份证号唯一,建立唯一约束)alter table stuInfoadd constraint UQ_StuID unique(stuID)--添加默认约束(地址默认为“地址不详”)alter table stuInfoadd constraint DF_stuAddress default('地址不详')for stuAddress--添加检查约束(年龄)alter table stuInfoadd constraint CK_stuAge check(Stuage between 15 and 40)--添加外键约束(主表stuInfo和从表StuMarks建立关系,关系字段为stuNO)alter table stuMarksadd constraint FK_stuNO foreign key(stuNO) references stuInfo(stuNO)5.使用SQL语句创建登录1、创建windows登录账户语法:exec sp_grantlogin‘windows域名\域账户’2、创建sql登录账户语法:exec sp_addlogin‘账户名’,’密码’3、创建数据库用户:需调用系统存储过程sp_grantdbaccessexec sp_grantdbaccess ‘登录账户’,’数据库用户’4、给数据库用户授权:常用的权限包括insert,delete,update,select,create table等等语法:grant权限[on 表名] to 数据库用户6、视图和索引---创建索引的语法if exists(select*from sysindexes where name='index_name')create [unique] [clustered] [nonclustered]index index_name on table_name(指定的字段)[withfillfactor=X]--指定按索引查询select*from table_name with(index_name)where [......]--创建视图的语法create view view_nameas<select语句>7、触发器1、语法: if exists(select * from sysobjects where name='trigger_name')drop trigger trigger_namegocreate trigger trigger_nameon table_name[with encryption]for [delete,insert,update]asT-SQL语句Go2、instead of 触发器---以下删除使用instead of触发器实现,原因:after触发器不能删除有主外键关系表的数据create trigger cardInfoDeleteon cardInfoinstead of deleteasset nocount onbegindeclare @cardid char(19)select @cardid=cardid from deletedbegin trandeclare @error intdelete from transinfo where cardid=@cardidset @error=@@errordelete from cardInfo where cardid=@cardidset @error=@@error+@errorif(@error<>0)beginraiserror('删除时出错,',16,1)rollbackendelseendset nocount off3、8、时间查询datediff(时间类型,前面比较小的时间,后面比较大的时间)<=datepart(dw,getdate())。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、深入浅出理解索引结构实际上,您可以把索引理解为一种特殊的目录。
微软的sql server提供了两种索引:聚集索引(c lustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。
下面,我们举例来说明一下聚集索引和非聚集索引的区别:其实,我们的汉语字典的正文本身就是一个聚集索引。
比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。
如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。
也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。
我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。
如果您认识某个字,您可以快速地从自动中查到这个字。
但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。
但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。
很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。
我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。
我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。
通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。
进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。
二、何时使用聚集索引或非聚集索引下面的表总结了何时使用聚集索引或非聚集索引(很重要):动作描述使用聚集索引使用非聚集索引列经常被分组排序应应返回某范围内的数据应不应一个或极少不同值不应不应小数目的不同值应不应大数目的不同值不应应频繁更新的列不应应外键列应应主键列应应频繁修改索引列不应应事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。
如:返回某范围内的数据一项。
比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。
三、结合实际,谈索引使用的误区理论的目的是应用。
虽然我们刚才列出了何时应使用聚集索引或非聚集索引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。
下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区,以便于大家掌握索引建立的方法。
1、主键就是聚集索引这种想法笔者认为是极端错误的,是对聚集索引的一种浪费。
虽然SQL SERVER默认是在主键上建立聚集索引的。
通常,我们会在每个表中都建立一个ID列,以区分每条数据,并且这个ID列是自动增大的,步长一般为1。
我们的这个办公自动化的实例中的列Gid就是如此。
此时,如果我们将这个列设为主键,SQL SERVER会将此列默认为聚集索引。
这样做有好处,就是可以让您的数据在数据库中按照ID 进行物理排序,但笔者认为这样做意义不大。
显而易见,聚集索引的优势是很明显的,而每个表中只能有一个聚集索引的规则,这使得聚集索引变得更加珍贵。
从我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,迅速缩小查询范围,避免全表扫描。
在实际应用中,因为ID号是自动生成的,我们并不知道每条记录的ID号,所以我们很难在实践中用ID号来进行查询。
这就使让ID号这个主键作为聚集索引成为一种资源浪费。
其次,让每个ID号都不同的字段作为聚集索引也不符合“大数目的不同值情况下不应建立聚合索引”规则;当然,这种情况只是针对用户经常修改记录内容,特别是索引项的时候会负作用,但对于查询速度并没有影响。
在办公自动化系统中,无论是系统首页显示的需要用户签收的文件、会议还是用户进行文件查询等任何情况下进行数据查询都离不开字段的是“日期”还有用户本身的“用户名”。
通常,办公自动化的首页会显示每个用户尚未签收的文件或会议。
虽然我们的where语句可以仅仅限制当前用户尚未签收的情况,但如果您的系统已建立了很长时间,并且数据量很大,那么,每次每个用户打开首页的时候都进行一次全表扫描,这样做意义是不大的,绝大多数的用户1个月前的文件都已经浏览过了,这样做只能徒增数据库的开销而已。
事实上,我们完全可以让用户打开系统首页时,数据库仅仅查询这个用户近3个月来未阅览的文件,通过“日期”这个字段来限制表扫描,提高查询速度。
如果您的办公自动化系统已经建立的2年,那么您的首页显示速度理论上将是原来速度8倍,甚至更快。
在这里之所以提到“理论上”三字,是因为如果您的聚集索引还是盲目地建在ID这个主键上时,您的查询速度是没有这么高的,即使您在“日期”这个字段上建立的索引(非聚合索引)。
下面我们就来看一下在1000万条数据量的情况下各种查询的速度表现(3个月内的数据为25万条):(1)仅在主键上建立聚集索引,并且不划分时间段:Select gid,fariqi,neibuyonghu,title from tgongwen用时:128470毫秒(即:128秒)(2)在主键上建立聚集索引,在fariq上建立非聚集索引:select gid,fariqi,neibuyonghu,title from Tgongwenwhere fariqi> dateadd(day,-90,getdate())用时:53763毫秒(54秒)(3)将聚合索引建立在日期列(fariqi)上:select gid,fariqi,neibuyonghu,title from Tgongwenwhere fariqi> dateadd(day,-90,getdate())用时:2423毫秒(2秒)虽然每条语句提取出来的都是25万条数据,各种情况的差异却是巨大的,特别是将聚集索引建立在日期列时的差异。
事实上,如果您的数据库真的有1000万容量的话,把主键建立在ID列上,就像以上的第1、2种情况,在网页上的表现就是超时,根本就无法显示。
这也是我摒弃ID列作为聚集索引的一个最重要的因素。
得出以上速度的方法是:在各个select语句前加:declare @d datetimeset @d=getdate()并在select语句后加:select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())2、只要建立索引就能显著提高查询速度事实上,我们可以发现上面的例子中,第2、3条语句完全相同,且建立索引的字段也相同;不同的仅是前者在fariqi字段上建立的是非聚合索引,后者在此字段上建立的是聚合索引,但查询速度却有着天壤之别。
所以,并非是在任何字段上简单地建立索引就能提高查询速度。
从建表的语句中,我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。
在此字段上建立聚合索引是再合适不过了。
在现实中,我们每天都会发几个文件,这几个文件的发文日期就相同,这完全符合建立聚集索引要求的:“既不能绝大多数都相同,又不能只有极少数相同”的规则。
由此看来,我们建立“适当”的聚合索引对于我们提高查询速度是非常重要的。
3、把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度上面已经谈到:在进行数据查询时都离不开字段的是“日期”还有用户本身的“用户名”。
既然这两个字段都是如此的重要,我们可以把他们合并起来,建立一个复合索引(compound index)。
很多人认为只要把任何字段加进聚集索引,就能提高查询速度,也有人感到迷惑:如果把复合的聚集索引字段分开查询,那么查询速度会减慢吗?带着这个问题,我们来看一下以下的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列):(1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>''2004-5-5''查询速度:2513毫秒(2)select gid,fariqi,neibuyonghu,title from Tgongwenwhere fariqi>''2004-5-5'' and neibuyonghu=''办公室''查询速度:2516毫秒(3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=''办公室''查询速度:60280毫秒从以上试验中,我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的,甚至比用上全部的复合索引列还要略快(在查询结果集数目一样的情况下);而如果仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。
当然,语句1、2的查询速度一样是因为查询的条目数一样,如果复合索引的所有列都用上,而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。
同时,请记住:无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。
四、其他书上没有的索引使用经验总结1、用聚合索引比用不是聚合索引的主键速度快下面是实例语句:(都是提取25万条数据)select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''使用时间:3326毫秒select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid<=250000使用时间:4470毫秒这里,用聚合索引比用不是聚合索引的主键速度快了近1/4。