设为首页 加入收藏

TOP

SQL应用与开发:(九)提高效率的索引(二)
2015-07-24 10:39:39 来源: 作者: 【 】 浏览:3
Tags:SQL 应用 开发 高效率 索引
据进行排序,然后删除原始表。因此,数据库上必须有足够的空闲空间,以容纳数据副本。

创建聚集索引时,应该注意一下事项:

· 大多数的表 都应该有聚集索引或使用分区来降低对表尾页的争用,在一个高度事务性的环境中,对最后一页的封锁将会严重影响系统的吞吐量。

· 在聚集索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(BETWEEN、<、<=、>、>=)或使用GROUP BY和ORDER BY的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行就可以保证物理上毗连在一起,而不必进一步搜索。这可以避免大范围扫描,提高了查询速度。

· 在一个频繁发生插入操作的表上建立聚集索引时,不要将索引在具有单调上升值得列(如IDENTITY)上,否则会经常引起封锁冲突。

·在聚聚索引中不要包含经常修改的列,因为码值修改后,数据行必须移动到新的位置。

· 选择聚集索引应基于WHERE子句和连接操作的类型。

聚集索引的候选键列是主键列,该列在WHERE子句中使用并且可以随机插入;按范围存取的列;在GROUP BY或ORDER BY中使用的列;不经常修改的列;在连接操作中使用的列。

2.3非聚集索引

非聚集索引与图书的索引类似。数据存储的一个位置,索引存储在另一个位置,索引带有指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这里可以由聚集索引定)。如果在表中未创建聚集索引,则无法保证这些行具有任何特定的顺序。

非聚集索引与聚集索引一样具有B-Tree结构,但是它与聚集索引有两个重大差别:

· 数据行不按非聚集索引键的顺序排序和存储。

· 非聚集索引的页层不包含数据页,相反,叶节点包含索引行。每个索引行包含非聚集键值以及一个或多个行定位器,这些行定位器指向有该键值的数据行(如果索引不唯一,则可能是多行)。

非聚集索引具有完全独立于数据行的结构。非聚集索引的最低行包含非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。数据行不按基于非聚集键的次序存储。

下图为非聚集索引的数据结构:

\

?

在使用非聚集索引时应注意以下问题:

· 索引需要使用多少空间;

· 建立索引的列是否稳定;

· 索引键是如何选择的,扫描效果是否更佳;

· 是否有许多重复值。

我们常在以下情况下使用非聚集索引:常用于集合函数的列和经常使用JOIN,ORDER BY和GROUP BY子句的列。

?

2.4唯一索引和组合索引

主键用来标识唯一行,它定义两个表的关系,用于生成索引的一个或一组列。根据索引键的组成,可以把索引分为三种类型:唯一索引、组合索引和覆盖索引。

2.4.1唯一索引

唯一索引不允许两行具有相同的索引值。在多列唯一索引的情况下,该索引可以确保索引列中每个值组合都是唯一的。如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。

在一个数据库表中,如果单列中有不止一行包含NULL值,则无法再该列上创建唯一索引。在列的组合中,如果其中有多个列包含NULL值,则这些NULL值被视为重复值。因此,在这样的多个列上也不能创建唯一索引。

2.4.2组合索引和覆盖索引

顾名思义,组合索引是指在一个表中使用不止一个列对数据进行索引的索引,它是通过连接两个或多个列值而创建的。

组合索引中可以使用2~16个列的索引,以两列或多列作为一个单位搜索时最好,或者许多查询只引用索引中指定的列时,应使用组合索引。组合索引中的所有列必须在同一个表中,并且组合索引值所允许的最大大小为900字节,即组成组合索引的固定大小列的总长度不得超过900字节。

当索引中包含了需要的所有信息时,这个索引称为覆盖索引。它的键值包含了满足查询的所有数据。

2.5其他索引类型

在各个版本的数据库系统中可以创建多种类型的索引,以适应各种数据表的特点,满足不同情况下的需求。下面简单举一个例子:

位图索引

在位图索引中并不是以索引列的值得的方式来存储索引信息的。位图索引为每个唯一的索引列建立一个位图,在这个位图中使用一个单元(Bit,取值为0或1)来对应一条记录的列值。如果该位元为1,说明与该位元对应的列值是一条包含该位图的索引列的记录。位元到列值得对应关系通过位图索引中的映射函数来完成。

这样,位图索引就能够以一种完全不同的内部机制来完成与B-Tree索引相同的功能。如果索引列的取值范围只包括少数几个固定的值,位图索引将会十分有效,并且能够节省存储空间。

3.创建

创建索引要知道哪些索引带来的好处大于开销。创建索引的最基本的命令是:

?

CREATE INDEX Index_name ON Table_name(Column_name1,Column_name2,...)
如同前面多次遇到的情况一样,CREATE INDEX语句的语法在不同数据库系统中差别很大。但所有的数据库系统都支持上述基本命令。

?

3.1复合索引

复合索引是指一个索引中包含了一个以上的列,也称为组合索引。在SQL Server中最多可以由16个列组合到一个索引中。

举例来说,在数据库“珠宝销售系统”中,查询所在城市为北京市的珠宝商信息。由于珠宝商所在城市的列值多次出现了重复值,则该列的选择性就比较低,如果在该列创建一个单列索引,那么气查询性能不是很高、注意珠宝商编号列的每一个值都是唯一值。为了提高索引的选择性,可以创建一个组合珠宝商所在城市和珠宝商编号的复合索引。其代码如下:

?

CREATE INDEX 所在城市_Index ON 珠宝商信息(珠宝商所在城市,珠宝商编号)

?

3.2唯一索引和主键索引

唯一索引可以确保列中不包含重复的值。当向具有唯一索引的表添加数据时,数据库会检查新添加的行在该列是否具有重复值。如果新添加的行与其他已经存在行在唯一索引列出现重复值,则数据库会显示错误,并且撤销输入操作。

只有当唯一性是数据本身的特性时,指定唯一索引才有意义。例如,当建立一个学籍管理系统数据库时,我们不想对学生姓名建立唯一索引,因为可能存在姓名相同的学生。正确的做法是,为每个学生建立一个学号,并在学号字段上建立唯一索引。

创建唯一索引的方法非常简单,只需在CREATE INDEX中使用UNIQUE关键字即可,这样就组成了唯一符合索引。

举例来说,在“销售管理系统”的操作人员信息表中规定:同名的操作人员必须设置不用密码,以保证系统的安全性。那么应该在密码和操作人员列上建立一个唯一符合索引:

?

CREATE UNIQUE INDEX 操作人员安全_Index ON 操作人员信息(操作人员姓名,密码) 
现在向数据表操作人员信息添加一个新的操作人员信息,新添加的操作人员信息是表中已重复的数据。
 
 
INSERT INTO 操作人员信息(操作人员编号,操作人员姓名,密码) VALUES(1009,'周慧芳','9698xie')

?

 执行上述语句应该会收到一个错误信息,提示用户不允许使用INSERT命令。这是由于该INSERT指令添加的数据违反了“操作人员安全_I
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇sql语句二 下一篇SQL查询初学者指南读书笔记(一)关..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·请问c语言刚入门,该 (2025-12-26 10:21:04)
·python 编程怎么定义 (2025-12-26 10:21:01)
·09-指 针 (一)-c语言 (2025-12-26 10:20:58)
·About - Redis (2025-12-26 08:20:56)
·Redis: A Comprehens (2025-12-26 08:20:53)