索引的初探(一)
以前听做DBA的朋友说索引能解决数据库百分之八十的问题,我也开始简单的写几篇关于索引的随笔,顺便来总结一下我理解的索引以及相关的知识,毕竟进步在于总结。
简介:
索引是数据库中一个排序的数据结构,以协助快速查询、更新数据库表中数据。我的理解就像是一本书,没有目录你也可以正常阅读,但是想要直接去读某个章节则需要全书寻找,太耽误时间了。所以索引就想目录一样帮助我们去直接定位文章的章节(数据的位置)。
索引结构:
在SQL Server中,索引(聚集索引)存储结构是一样的,都是B树。如图所示:
索引 B 树中的每一页称为一个索引节点。B 树的顶端节点称为根节点。索引中的底层节点称为叶节点。根节点与叶节点之间的任何索引级别统称为中间级。在聚集索引中,叶节点包含基础表的数据页。根节点和中间级节点包含存有索引行的索引页。每个索引行包含一个键值和一个指针,该指针指向 B 树上的某一中间级页或叶级索引中的某个数据行。每级索引中的页均被链接在双向链接列表中。
对于数据库的检索和查询而言,当没有索引的时候就需要在包含表的数据的所有磁盘(数据页)进行全盘扫描,这样无疑非常消耗时间。通过对索引的根节点和叶子节点的扫描大大减少了磁盘IO,从而提高了效率。
下面我们通过一个例子来说明一下:
左图是没有加索引的表,读取大于某个时间段的数据时逻辑读取(IO)了4808次;然后右图添加了查询字段的索引后,锐减为1792次,可见在加入了索引以后改变了对表数据的检索和方式大大提高了读取速度。
创建、删除和修改索引的语法:
1.创建索引的语法:
CREATE [UNIQUE][CLUSTERED | NONCLUSTERED] INDEX index_name
ON {table_name | view_name} [WITH [index_property [,....n]]
说明:
UNIQUE: 建立唯一索引。
CLUSTERED: 建立聚集索引。
NONCLUSTERED: 建立非聚集索引。
Index_property: 索引属性。
2.删除索引语法:
DROP INDEX table_name.index_name[,table_name.index_name]
说明:table_name: 索引所在的表名称。
index_name : 要删除的索引名称。
3.修改索引
ALTER INDEX {<name of index> | ALL} ON<table or view name>{ REBUILD [[ WITH [index_property ]...]}
索引的缺点:
1创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
3当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
总结:
今天我们先从索引的概念和结构原理上来了解了索引的一般机制,以及对数据检索带来哪些基本好处,我们知道了索引的一般语法和缺点。作为一个优化数据库的工具索引是我们使用数据库不可或缺的工具,这篇作为开端只是简单介绍,接下来我将开始对索引进行分类详述包括:聚集和非聚集,索引的实践分析以及索引的维护等方面,预计本周完成其中一二。