SQL server 数据库之“索引”详解

什么是索引?
数据库中的索引与书籍中的目录类似,索引使SQL Server编排数据的内部方法,它为SQL Server提供一种方法来编排查询数据的路由。

索引页是数据中存储索引的数据页。索引页存放检索数据行的关键字页及该数据行的地址指针。通过使用索引,可以大大提高数据库的检索速度、改善数据库性能。

索引的分类
1、唯一索引

唯一索引不允许两行具有相同的索引值。创建了唯一约束,将自动创建唯一索引。尽管唯一索引有助于找到信息,但是为了获得最佳性能,建议使用主键约束。
2、主键索引

在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。
主键索引要求主键中的每个值时唯一的。当在查询中使用主键索引时,它还允许快速访问数据。
3、聚集索引

在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同。

4、非聚集索引

非聚集索引建立在索引页上,在查询数据时可以从索引中找到记录存放的位置。非聚集索引使表中各行数据存放的物理顺序与键值的逻辑顺序不匹配,聚集索引比非聚集索引有更快的数据访问速度。例如,按笔画排序的索引就是非聚集索引,“1”画的字(词)对应的页码可能比“3”画的字(词)对应的页码大(靠后)。

在SQL Server中,一个表只能创建一个聚集索引,但可以将多个非聚集索引。设置某列为主键,该列就默认为聚集索引。

5、复合索引

在创建索引时,并不是只能对其中一列创建索引,与创建主键一样,可以将多个列组合为索引,这种索引称为符合索引。
需要注意的是,只有用到复合索引的第一列或整个复合索引列作为条件完成数据查询时才会用到该索引。

6、全文索引

全文索引使一种特殊类型的基于标记的功能性索引,由SQL Server中全文引擎服务创建和维护。全文索引主要用于大量文本中搜索字符串,此时使用全文索引的效率将大大高于使用T-SQL的LIKE关键字的效率。

由于SQL server 图形化操作,创建索引比较简单,就略过创建步骤了,创建索引后,可以像查字典时选择拼音方式或笔画方式一样,指定SQL server数据查询的索引查询方式,T-SQL语句如下:

select * from xueyuan                                             #指定查询的表
with (index=ix_name)                                             #指定要依据的索引
where  学员姓名 like ‘孙%‘                                       #查询条件

虽然可以指定SQL server 按哪个索引进行查询,但一般不需要我们人工指定,SQL server 将会根据所创建的索引,自动优化查询。

使用索引可加快数据检索速度,但为每个列都建立索引没有必要。因为索引自身也需要维护,并且占用一定的资源,可以按照以下标准选择建立索引的列。

  1. 频繁搜索的列。
  2. 经常用于查询选择的列。
  3. 经常排序、分组的列。
  4. 经常用于连接的列(主键/外键)。

不要使用下面的列创建索引。

  1. 仅包含几个不同值得列。
  2. 表中仅包含几行,为小型表创建索引可能不太划算,因为SQL Server在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长。

在SQL 语句中,特别是在select语句中正确使用索引可以大大提高查询速度,保证应用程序的运行性能。提供几条经验,仅供大家参考:

  1. 查询时尽量减少使用“星号”返回全部列,不要返回不需要的列。
  2. 索引应该尽量小,在字节数小的列上建立索引。
  3. where 字句中有多个条件表达式时,包含索引列的表达式应置于其他表达式之前。
  4. 避免在order by 字句中使用表达式。
  5. 根据业务数据发生频率,定期重新生成或重新组织索引,进行碎片整理。(因为在SQL server中,索引数据是由系统自动维护的,在增加、删除和修改数据后,索引数据可能会更新。随着长期频繁的数据更新,索引数据会分散在磁盘的不同位置,形成碎片,由此造成查询速度越来越慢,因此,根据数据更新的频率,定期删除原有索引,重新创建相同的索引,让索引存放在连续的空间中,以此删除碎片,可提高查询速度。)

原文地址:https://blog.51cto.com/14154700/2375890

时间: 2024-10-25 06:19:30

SQL server 数据库之“索引”详解的相关文章

SQL SERVER分区具体例子详解

在日常工作中,我们会遇到以下的情况,一个表每日数万级的增长,而查询的数据通常是在本月或今年,以前的数据偶尔会用到,但查询和插入的效率越来越慢,用数据库分区会有助于解决这个问题.关于分区的理论知识网上很多我这里就不在累赘,我从一个实际例子出发,看如何将一个已经运行了很长时间的普通表进行分区. 回到目录 提出问题 需解决问题:有一个数据表数据很大,我们通常的查询是在一个季度中.我们需要将以往年份的数据按不同年份存在文件组里,当年的数据分为4个季度存,如果到了新的一年,将之前4个季度的合并到一年中,新

SQL Server DBA工作内容详解

原文:SQL Server DBA工作内容详解 在Microsoft SQL Server 2008系统中,数据库管理员(Database Administration,简称为DBA)是最重要的角色.DBA的工作目标就是确保Microsoft SQL Server 2008系统正常高效地运行.DBA的工作也是最繁忙的工作,无论是性能调整,还是灾难恢复,都离不开DBA的支持. 一般地,作为一个DBA,至少应该做好以下12项任务: 任务一:安装和配置; 任务二:容量规划; 任务三:应用架构设计; 任

SQL Server 事务隔离级别详解

原文:SQL Server 事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设计数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一定的影响作用. 步骤 事务隔离级别通过影响读操作来间接地影响写操作:可以在回话级别上设置事务隔离级别也可以在查询(表级别)级别上设置事务隔离级别.事务隔离级别总共有6个隔离级别:READ UNCOMMITTED(未提交读,读脏),相当于(NOLOCK)R

SQL Server 执行计划操作符详解(2)——串联(Concatenation )

本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻想一下是干嘛的.其实还是挺直观,就是把东西连起来,那么下面我们来看看到底连什么?怎么连?什么时候连? 简介: 串联操作符既是物理操作符,也是逻辑操作符,在中文版SQL Server的图形化执行计划中称为"串联",在其他格式及英文版本中称为"Concatenation".

sql server数据库中索引失效的问题讨论

有关于数据库中索引失效的问题,网上也有相关的讨论.不过他们是针对oracle数据库进行讨论的.那么在sql server数据库中索引什么时候 会失效呢.总结了一下,不过我没有经过测试.没测试就没有发言权,这里仅供自己参考. 首先,所谓失效.并不真的就是这个索引被删除了.而是在这些情况下,DBMS不会检索索引列表了.执行速度和没有这个索引时的速度一样. 但是再执行另外的一条语句.同样索引可以正常起作用.所以索引的失效是针对某条sql语句的,而不是针对索引本身的.那么在哪些情况下, 确切的说是在哪类

SQL Server 执行计划操作符详解(1)——断言(Assert

前言: 很多很多地方对于语句的优化,一般比较靠谱的回复即使--把执行计划发出来看看.当然那些只看语句就说如何如何改代码,我一直都是拒绝的,因为这种算是纯蒙.根据本人经验,大量的性能问题单纯从语句来看很难发现瓶颈,同一个语句,由于环境的不同,差距非常大,所以比较合适的还是分析执行计划. 那么对于执行计划,一般使用图形化执行计划就差不多了,但是用过的人也有一些疑惑,里面的图标(称为操作符)并不非常直观.所以从本文开始,会整理一些不怎么常见但由比较重要的操作符并进行解释,对于那些表扫描.索引扫描.聚集

SQL SERVER 中的Schema详解

以往 SQL Server 内的对象命名是"服务器.数据库.用户名.对象",但新版的对象命名改为"服务器.数据库.Schema.对象".这让你规划数据库对象命名时更有弹性. 架构是形成单个命名空间的数据库实体的集合.命名空间是一个集合,其中每个元素的名称都是唯一的. 虽然 SQL Server 2000 包含 CREATE SCHEMA 语句,但实际上并不会像上面所定义的那样创建架构.在 SQL Server 2000 中,数据库用户和架构是隐式连接在一起的.每个数

SQL Server 2012 安装过程详解(包含每一步设置的含义)

转http://www.cnblogs.com/EastLiRoar/p/4051969.html 一.启动安装程序,点击"安装"选项卡,选择"全新SQL Server独立安装或向现有安装添加功能".(首次安装数据库系统或向现有数据库系统添加功能,均选择此选项)

SQL server中的parsename详解

1.SQL server中如何拆分ip地址 比如有一个ip地址是 192.168.0.8 2.再或者,如何拆分一个包装比例,比如1:5:3 用parsename方法即可以实现: select parsename(replace('1:5:3',':','.'),1) 执行结果是:3 select parsename(replace('1:5:3',':','.'),2) 执行结果是:5 select parsename(replace('1:5:3',':','.'),3) 执行结果是:1