转自:http://blog.csdn.net/acupofnescafe/archive/2009/01/15/3789723.aspx
索引就是表中数据和相应物理存储位置的列表
索引的三种类型:
1. 唯一性索引:在索引列中不能有相同的两个列值存在,可以保证每一行数据的唯一性;
2. 聚簇索引(会改变数据物理存储位置的一种索引);
3. 非聚簇索引
根据索引的顺序与数据表的物理顺序是否相同,可以把索引分为聚簇索引和非聚簇索引。聚簇索引的顺序和数据表的物理顺序相同;非聚簇索引的顺序和数据表的物理顺序不同。
聚簇索引中,页的顺序总是升序。聚簇索引对于那些经常要搜索范围值的列特别有效。使用聚簇索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。在表中经常搜索的列或按照顺序访问的列,应该创建聚簇索引。当创建聚簇索引时,应注意以下因素:
(1) 每一个表,只能有一个聚簇索引
(2) 表中行的物理顺序和索引中行的物理顺序是相同的。在创建任何非聚簇索引之前创建聚簇索引,因为聚簇索引改变了表中行的物理顺序。数据行按照一定的顺序排列,并且自动维护这个顺序。
(3) 关键值的唯一性要么使用UNIQUE关键字明确维护,要么由一个内部的唯一标识符明确维护。这些唯一标识符是系统自己使用的,用户不能访问。
(4) 聚簇索引的平均大小大约是数据表的5%,但是实际的聚簇索引的大小常常根据索引列的大小不同而变化。
非聚簇索引表示行的逻辑顺序。SQL server 2000在搜索数据值时,先对非聚簇索引进行行搜索,找到数据值在表中的位置,然后从该位置直接检索数据,这使非聚簇索引成为精确匹配查询的最佳方法。当需要以多种方式检索数据时,非聚簇索引就非常有用了。创建非聚簇索引时,要考虑以下情况:
(1) 在默认情况下,创建的索引是非聚簇索引
(2) 在每一个表上面,可以创建不多于249个非聚簇索引
(3) 索引页的叶级只包含索引的关键字,不包含实际的数据
在考虑是否为一列创建索引时,应考虑被索引的列,是否以及如何用于查询中。索引对下列查询很有帮助:
(1) 搜索符合特定搜索关键字的行(精确匹配查询)。精确匹配比较是指查询使用WHERE语句指定具有给定值的列条目。
(2) 搜索其搜索关键字值为范围值的行(范围查询)。范围查询是指查询指定其值介于两个值之间的任何条目。
(3) 在表T1中搜索根据连接谓词与表T2中的某个行匹配的行(索引嵌套循环联接)。
(4) 在不进行显示排序操作的情况下,按一种有序的顺序对行进行扫描,以允许基于顺序的操作,如合并联接和流聚合。
(5) 以优于表扫描的性能对表中所有的行进行扫描,性能提高是由于减少了要扫描的列集和数据总量(该查询有覆盖索引可供使用)
(6) 搜索插入和更新操作中重复的新搜索关键字值,以实施PRIMARY KEY和UNIQUE约束。
(7) 搜索已定义了FOREIGN KEY约束的两个表之间的匹配的行。
(8) 使用LIKE比较进行查询时,如果模式以特定字符串如“abc%”开头,使用索引则会提高效率;如果模式以通配符如“%xyz”开头,则索引不起作用。
在很多查询中,索引可以带来多方面的好处。例如,索引除了提供对单一行的快速访问外,还使得可以进行范围查询。SQL Server可以在同一个查询中为一个表使用多个索引,并可以合并多个索引(使用联接算法),以便搜索关键字共同覆盖一个查询。另外,SQL Server会自动确定利用那些索引进行查询,并且能够在表被改动时确保该表的所有索引都得到维护。另外,索引设计的时候还要考虑的其他准则,主要包括以下几点:
(1) 一个表,如果建有大量索引会影响INSERT,UPDATE和DELETE语句的性能,因为在表中的数据更改时,所有索引都必须进行适当的调整。另一方面,对于不需要修改数据的查询(SELECT语句),大量索引有助于提高性能,因为SQL Server有更多的索引可供选择,以便确定以最快速度访问数据的最佳方法。
(2) 覆盖的查询可以提高性能。覆盖的查询是指查询中所有指定的列,都包含在同一个索引中。创建覆盖一个查询的索引可以提高性能,因为该查询的所有数据都包含在索引自身当中;检索数据时只需引用表的索引页,不必引用数据页,因而减少了I/O总量。尽管给索引添加列以覆盖查询可以提高性能,但在索引中额外维护更多的列,会产生更新和存储成本。
(3) 对小型表进行索引可能不会产生优化效果,因为SQL Server在遍历索引以搜索数据时,花费的时间可能会比简单的表扫描还长。
(4) 应使用SQL事件探查器和索引优化向导帮助分析查询,确定要创建的索引。
(5) 可以在视图上指定索引
(6) 可以在计算列上指定索引。
分享到:
相关推荐
### 关于索引概念、特点、优点、缺点、分类及使用的详细解读 #### 索引的概念 在数据库管理系统(DBMS)中,索引是一种数据结构,它可以帮助快速定位数据库表中的数据记录,从而提高数据检索的速度。索引类似于...
本篇文章将详细讲解MySQL中关于索引的相关知识点,包括索引的数据结构及其优劣,以及如何查看和分析SQL执行计划。 1. **索引的数据结构** - **哈希索引**:适用于单条记录查询,哈希索引通过哈希函数将键值转化为...
本文将深入探讨在阿里面试中可能会遇到的关于索引的问题及背后的知识点,以期帮助求职者更好地准备面试。 首先,索引的基本概念是必须掌握的基础。索引可以被理解为数据库中用于加快数据检索速度的数据结构。通过...
以上就是Elasticsearch RestHighLevelClient关于索引库和文档的基本操作。在实际应用中,还需要考虑错误处理、集群配置、性能优化等因素。了解并熟练掌握这些操作,将有助于我们更好地利用Elasticsearch来管理和检索...
在Oracle数据库中,索引分为B树索引、位图索引、函数索引等多种类型,每种都有其特定的应用场景和优缺点。 二、B树索引 B树索引是最常见的索引类型,适用于全值匹配查询。在Oracle中,B树索引由一个或多个索引块...
MySQL中的索引是数据库性能优化的关键工具,它能显著提高数据检索的速度。下面将详细讨论索引的类型、存储方式以及可能导致索引失效的场景。 首先,我们来看一下索引的类型: 1. **主键索引(Primary Key Index)*...
### C#中的索引器详解 #### 一、索引器概述 索引器是C#语言提供的一个特性,它允许我们像操作数组那样通过索引来访问类或结构体的实例成员。通常情况下,当我们想要根据某个键或者索引来获取或设置对象内部的数据...
MySQL数据库中的索引是提高查询效率的关键技术,尤其是在处理大量数据时。本文主要探讨了MySQL数据库索引的原理、类型和优化方法。作者通过实例分析,展示了索引在解决数据库性能问题上的重要作用。 首先,作者指出...
这是数据库课后的一个习题,由于本人初学者,做的不是很好,不过还是希望可以帮到你。
通过上述命令,我们可以获取到关于索引的详细信息,包括扫描页数、扫描扩展盘区数、扩展盘区开关数等。这些指标可以帮助我们评估索引的健康状况,进而决定是否需要对索引进行优化。 #### 五、解决索引碎片的方法 ...
如果你运行这个向导,你会看到关于数据库中关于索引的统计量,这些统计量作为日志工作并定时更新,这样就减轻了手工重建索引所带来的工作量。如果你不想自动维护索引,那么你可以手工重建索引,并在需要时执行 ...
关于索引的常识影响到数据库性能的最大因素就是索引。由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅。我在这里只讨论两种SQLServer索引,即clustered...
关于索引使用的一些参考经验: 1. 无法使用索引的场景 索引并不总是有用的,有些情况下,索引可能会降低性能。例如,如果查询语句中的 WHERE 子句中包含多个列,而这些列都有索引,那么索引可能会被忽略。 2. ...
- `comment`: 关于索引的注释。 - `index_comment`: 索引的用户定义注释。 #### 四、检查MySQL索引是否生效 为了确保索引能够正常工作并提高查询效率,我们需要验证索引是否被实际使用。这通常通过`EXPLAIN`命令来...
根据“索引使用规则.txt”文件提供的信息,我们可以深入探讨一系列关于索引使用的最佳实践与限制条件,以下是对这些规则的详细解析: ### 1. 索引与逻辑运算符的兼容性 当在WHERE子句中使用`NOT`或`LIKE '%XX%'`这...
通过解析这个DDL语句,我们可以获得关于索引的所有细节,包括它所基于的表和列。 ### 结论 查询索引对应的表和列对于理解数据库结构、优化查询效率以及进行数据库维护至关重要。通过以上介绍的两种方法——查询...
接下来,文件中提到了几个关于索引使用的常见误区: 1. 索引并非越多越好。虽然索引可以加快查询速度,但过多的索引会降低更新操作的效率,因为每次数据变更操作都需要更新所有相关索引。因此,创建索引时应该进行...
关于索引的最佳实践,有以下几点值得注意: 1. **选择合适的数据类型**:索引的性能与数据类型密切相关,尽可能使用占用空间小且排序效率高的数据类型。 2. **主键索引**:每个表应有一个唯一的主键,这将自动创建...
Richard Foote:1982年从英国移民到澳洲堪培拉,1996年进入ORACLE公司,2002年离开ORACLE,从事ORACLE咨询服务。其专长是对ORACLE索引的深入研究,揭示了我们看不到的地方。