`

MSSQL聚集索引與非技術索引設計指南

阅读更多

(一)聚集索引设计指南

聚集索引基于数据行的键值在表内排序和存储这些数据行.每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储.

定义聚集索引来实现下列功能:

1:可用于经常使用的查询

提供高度唯一性.
注意:
创建 PRIMARY KEY 约束时,将在列上自动创建唯一索引.

默认情况下,此索引是聚集索引,但是在创建约束时,可以指定创建非聚集索引.

2:可用于范围查询

如果未使用 UNIQUE 属性创建聚集索引,数据库引擎将向表自动添加一个 4 字节的 uniqueifier 列.
必要时,数据库引擎将向行自动添加一个 uniqueifier 值以使每个键唯一。此列和列值供内部使用,用户不能查看或访问.

**查询注意事项 **

在创建聚集索引之前,应先了解数据是如何被访问的,考虑对具有以下特点的查询使用聚集索引:

(1)使用运算符(如 BETWEEN、>、>=、 < 和 <=)返回一系列值。

使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行物理相邻.

例如,如果某个查询在一系列销售订单号间检索记录,SalesOrderNumber 列的聚集索引可快速定位包含起始销售订单号的行,然后检索表中所有连续的行,直到检索到最后的销售订单号.

(2)返回大型结果集。

使用 JOIN 子句;一般情况下,使用该子句的是外键列.

(3)使用 ORDER BY 或 GROUP BY 子句.

在 ORDER BY 或 GROUP BY 子句中指定的列的索引,可以使数据库引擎不必对数据进行排序,因为这些行已经排序.这样可以提高查询性能.

**列注意事项**

一般情况下,定义聚集索引键时使用的列越少越好.考虑具有下列一个或多个属性的列:

唯一或包含许多不重复的值

(1)唯一或包含许多不重复的值

例如,雇员 ID 唯一地标识雇员.

EmployeeID 列的聚集索引或 PRIMARY KEY 约束将改善基于雇员 ID 号搜索雇员信息的查询的性能.

另外,可对 LastName、FirstName、MiddleName 列创建聚集索引,

因为经常以这种方式分组和查询雇员记录,而且这些列的组合还可提供高区分度.

(2)按顺序被访问

(3)经常用于对表中检索到的数据进行排序。
按该列对表进行聚集(即物理排序)是一个好方法,它可以在每次查询该列时节省排序操作的成本.

**聚集索引不适用于具有下列属性的列:**

(1)频繁更改的列
这将导致整行移动,因为数据库引擎必须按物理顺序保留行中的数据值.

这一点要特别注意,因为在大容量事务处理系统中数据通常是可变的.

(2)宽键

宽键是若干列或若干大型列的组合.

所有非聚集索引将聚集索引中的键值用作查找键.

为同一表定义的任何非聚集索引都将增大许多,这是因为非聚集索引项包含聚集键,同时也包含为此非聚集索引定义的键列.

(二)非聚集索引设计指南

非聚集索引包含索引键值和指向表数据存储位置的行定位器

可以对表或索引视图创建多个非聚集索引.通常,设计非聚集索引是为改善经常使用的、没有建立聚集索引的查询的性能.

与使用书中索引的方式相似,查询优化器在搜索数据值时,先搜索非聚集索引以找到数据值在表中的位置,然后直接从该位置检索数据.

这使非聚集索引成为完全匹配查询的最佳选择,因为索引包含说明查询所搜索的数据值在表中的精确位置的项.

例如,为了从 HumanResources.Employee 表中查询向特定经理负责的所有雇员,查询优化器可能使用非聚集索引 IX_Employee_ManagerID,它以 ManagerID 作为其键列.查询优化器能快速找出索引中与指定 ManagerID 匹配的所有项.

每个索引项都指向表或聚集索引中准确的页和行,其中可以找到相应的数据.

在查询优化器在索引中找到所有项之后,它可以直接转到准确的页和行进行数据检索.

**数据库注意事项 **

(1)更新要求较低但包含大量数据的数据库或表可以从许多非聚集索引中获益从而改善查询性能.

    与全表非聚集索引相比,考虑为定义完善的数据子集创建筛选索引可以提高查询性能、降低索引存储开销并减少索引维护开销.

(2)决策支持系统应用程序和主要包含只读数据的数据库可以从许多非聚集索引中获益.

    查询优化器具有更多可供选择的索引用来确定最快的访问方法,并且数据库的低更新特征意味着索引维护不会降低性能.

(3) 联机事务处理应用程序和包含大量更新表的数据库应避免使用过多的索引.此外,索引应该是窄的,即列越少越好.
    对表编制大量索引会影响 INSERT、UPDATE、DELETE 和 MERGE 语句的性能,因为当表中的数据更改时,所有索引都须进行适当的调整.  

**查询注意事项 **

   在创建非聚集索引之前,应先了解访问数据的方式.考虑对具有以下属性的查询使用非聚集索引:

(1)使用 JOIN 或 GROUP BY 子句.
   应为联接和分组操作中所涉及的列创建多个非聚集索引,为任何外键列创建一个聚集索引.

(2)不返回大型结果集的查询.
   创建筛选索引以覆盖从大型表中返回定义完善的行子集的查询.

(3)包含经常包含在查询的搜索条件(例如返回完全匹配的 WHERE 子句)中的列.

**列注意事项 **

考虑具有以下一个或多个属性的列:

(1)覆盖查询.
当索引包含查询中的所有列时,性能可以提升.查询优化器可以找到索引内的所有列值;

不会访问表或聚集索引数据,这样就减少了磁盘 I/O 操作。使用具有包含列的索引来添加覆盖列,而不是创建宽索引键.

如果表有聚集索引,则该聚集索引中定义的列将自动追加到表上每个非聚集索引的末端.

这可以生成覆盖查询,而不用在非聚集索引定义中指定聚集索引列.

例如:如果一个表在 C 列上有聚集索引,则 B 和 A 列的非聚集索引将具有其自己的键值列 B、A 和 C.

(2)大量非重复值

如姓氏和名字的组合(前提是聚集索引被用于其他列)。
如果只有很少的非重复值,例如仅有 1 和 0,则大多数查询将不使用索引,因为此时表扫描通常更有效.

对于这种类型的数据,应考虑对仅出现在少数行中的非重复值创建筛选索引。

例如,如果大部分值都是 0,则查询优化器可以对包含 1 的数据行使用筛选查询

分享到:
评论

相关推荐

    mysql存储与索引技术

    MySQL 的索引分为两种主要类型:MyISAM 使用非聚集索引,索引与数据分开存储,而 InnoDB 使用聚集索引,索引和数据在同一结构中,因此 InnoDB 的索引支持更快的查找,但不支持全文检索。在索引优化方面,最左前缀...

    面试mysql 之索引 锁 事物

    ### MySQL索引、锁与事务详解 #### 一、索引 **索引定义与作用:** 索引是一种数据结构,用于加速数据检索的过程。它通过建立数据表中某些列的值与行的位置之间的映射关系,使得数据库系统能够快速定位到所需的...

    Mysql数据库索引创建、索引删除、索引失效场景详解

    但是,需要注意的是,如果索引与主键关联,必须先删除主键,再删除主键索引。 索引的失效场景包括:更新或删除索引列,使用不带索引的全表扫描操作,使用`SELECT *`而不是明确列出索引列,使用`NOT IN`、`&lt;&gt; ALL()`...

    MySQL之高效覆盖索引

    ### MySQL之高效覆盖索引 ...通过合理地设计和使用覆盖索引,可以大大提高MySQL数据库的性能。在实际应用中,应根据具体的查询需求来创建合适的覆盖索引,并定期检查和调整索引策略,以保持系统的高性能运行。

    mysql查询优化之索引优化

    - **InnoDB存储引擎的索引优化**:InnoDB支持行级锁定,其主键索引是聚簇索引,其他非主键索引是非聚簇索引。理解这些特性有助于更好地设计索引。 - **分区与分片**:对于超大型表,可以考虑使用分区或分片技术,将...

    MySQL索引分析和优化.pdf

    ### MySQL索引分析与优化详解 #### 一、引言 在现代数据库管理系统中,索引扮演着极其重要的角色。合理的索引设计不仅能显著提升查询性能,还能优化数据的存储结构,进而提高整个系统的响应速度。本文将深入探讨...

    Mysql索引数据结构.pptx

    MySQL 索引数据结构是数据库管理系统中提升查询效率的关键技术。当我们在处理查询速度较慢的 SQL 语句时,通常会考虑引入索引来优化。索引是一种特殊的数据结构,它按照一定的排序规则存储了数据表中的部分或全部...

    MySQL索引背后的数据结构及算法原理

    正如标题所提到的,“MySQL索引背后的数据结构及算法原理”这一主题是技术面试中的重要内容之一。本文旨在深入探讨MySQL索引的相关概念及其背后的原理。 #### 索引的本质 索引本质上是一种数据结构,其目的是帮助...

    MySQL索引分类及相关概念辨析.doc

    首先,从数据结构的角度来看,MySQL索引主要包括以下三种: 1. **B+树索引**:这是最常见的索引类型,InnoDB存储引擎默认使用B+树来构建索引。B+树的特点是所有数据都在叶子节点存储,非叶子节点只存储索引,便于...

    MySQL索引原理

    ### MySQL索引原理详解 #### 一、索引的基本概念 **索引**是帮助MySQL高效获取数据的数据结构。在数据库中,索引扮演着极其重要的角色,它能够显著提高数据检索的速度,尤其是在处理大规模数据集时尤为重要。索引...

    MySQL索引及其原理1

    MySQL索引是数据库管理系统中用于加速数据检索的关键技术。它基于特定的数据结构,如B+树,以提高查询效率,避免全表扫描。在本文中,我们将深入理解MySQL索引的定义、类型、原理以及如何在实践中有效利用它们。 1....

    mysql索引共2页.pdf.zip

    【MySQL索引详解】 在MySQL数据库管理系统中,索引是一种数据结构,用于快速查找数据库表中的特定记录。索引能够显著提升查询性能,减少数据检索的时间,尤其在处理大量数据时,其作用尤为明显。本文件"mysql索引共...

    MySQL索引_021

    【MySQL索引详解】 在MySQL数据库管理中,索引是一种高效的数据检索机制,极大地提高了查询速度。本篇文章将深入探讨MySQL的索引机制,特别是基于InnoDB存储引擎的索引特性。 1. **B+树索引** - **每个索引对应一...

    mysql索引与sql调优

    ### MySQL索引与SQL调优知识点详解 #### 一、MySQL简介及背景 MySQL是一款广泛使用的开源关系型数据库管理系统(RDBMS),最初由瑞典MySQL AB公司开发。2008年1月,Sun Microsystems将其收购;随后在2009年,Oracle ...

    mysql索引原理之聚簇索引1

    MySQL中的索引是提高数据库查询性能的关键技术,尤其在处理大量数据时。索引分为聚簇索引(Clustered Index)和非聚簇索引(Secondary Index)。聚簇索引决定了数据行在磁盘上的物理存储顺序,而非聚簇索引则不遵循...

    mysql索引失效.docx MySQL索引失效是指在查询执行过程中,数据库无法有效地使用索引来提高查询性能

    ### MySQL索引失效详解 #### 一、引言 在日常工作中,SQL是不可或缺的技术工具之一,但在实际操作中,不少开发人员对于SQL优化及索引的理解并不深入。特别是当数据量逐渐增大时,索引的正确使用与否直接影响着系统...

    MySQL索引与Index Condition Pushdown

    ### MySQL索引与Index Condition Pushdown详解 #### 一、MySQL索引概述 索引是数据库性能优化的关键技术之一,其主要目的是加快数据检索的速度。在MySQL中,索引是通过B-Tree(B树)数据结构来实现的。本文将重点...

    mysql索引资料学习

    MySQL索引是数据库管理系统中用于加速数据检索的关键技术。索引的存在使得数据库系统不必全表扫描,而是通过索引直接定位到所需数据,显著提高了查询效率。本篇将深入探讨MySQL中的索引机制,特别是B+树索引,以及...

    MySQL数据库索引的研究.pdf

    MySQL数据库索引是提高数据检索速度的关键技术,它涉及数据库管理系统中的数据结构和算法。在关系型数据库中,如MySQL,索引被广泛应用于加速查询操作,尤其对于大型数据集,索引的作用尤为重要。 首先,我们要理解...

Global site tag (gtag.js) - Google Analytics