系统性能调优(4)----数据库常见索引
1、B树索引
这是最常见的索引,几乎所有的关系型数据库系统都支持B树结构的索引,也是被最多使用的,其树结构与二叉树比较类似,根据行id快速定位到行。大部分数据库默认建立的索引就是这种索引。B树索引在检索高基数数据列(高基数列是指该列有很多不同的值,该列所有不同值的个数之和与该列所有值的个数之和的比成为列基数)时提供了比较好的性能,B树索引是基于二叉树的,由分支块和叶块组成。在树结构中,位于最底层的块成为叶块,包含每个被索引列的值和行所对应的rowid。在叶节点的上面是分支块,用来导航结构,包含了索引列(关键字)范围和另一索引快的地址。
2、聚集索引
没错,这是sqlserver里很重要的一个索引,也叫群集索引。聚集索引是相对于常规索引而言的,oracle也有类似的索引,不过叫聚簇索引,注意,虽然聚簇和聚集仅有一字之差,但是oracle的聚簇索引和sqlserver的聚集索引还是有很多的不同的,oracle的聚簇索引可以针对多表,根据多个表相同列的不同值,将相关数据聚集在周围。
sqlserver聚集索引也有类似的意思,但是只能针对单表。在oracle里,聚簇”是oralce内部的一个对象,就像基本表、视图、触发器这些概念一样。聚簇索引就是对聚簇进行的索引,由于比较复杂。在此不详细讨论,但在sqlserver里,聚集索引直接作用在表上,因此不可以将二者混淆。反正不能等同来看就是了。
3、非聚集索引
非聚集索引是一种典型的B树索引,每个叶块只包含两种数据,一种是索引项,一种是该索引项所在行的行指针,当查询的数据匹配该索引项数据的时候,将会取出对应的行指针,取得该行的数据.如果要根据键值从大型SQLServer表提取具有良好选择性的少数几行,非聚集索引最有用。B树的底部或叶级包含组成该索引的列中的所有数据。当用非聚集索引检索表中与键值匹配的信息时,将搜索整个索引B树,直到在索引叶级找到一个与键值匹配的值。在非聚集索引中,叶级节点仅包含参与索引的数据以及快速找到相关数据页上其它行数据的指针。最糟糕的情况是,从非聚集索引中获得的每一行都要求一个额外的不连续磁盘I/O才能检索行数据。最好的情况是,所需要的行有许多都位于相同的数据页,因此在提取每个数据页时可检索多行。如果是聚集索引,索引的叶级节点是表的实际数据行。因此,检索表数据时不需要指针跳动。基于聚集索引的范围扫描执行情况很好,因为聚集索引的叶级(即表的所有行)在物理上按照组成聚集索引的列顺序排列在磁盘上。
4、覆盖索引
覆盖索引是非聚集索引的一个特例。覆盖索引的定义是在选择条件和WHERE谓词上均满足SQL查询的所有列的基础上建立的非聚集索引。覆盖索引可以节省大量的I/O,因此可极大地改善查询的性能。但是有必要在新建索引(以及与它相关的B树索引结构维护)所需要的代价和覆盖索引所带来的I/O性能增益之间进行权衡。如果覆盖索引对于SQLServer上经常运行的查询或查询组极其有利,那么创建覆盖索引是值得的。
5、位图索引
这个不是sqlserver的索引,它是oracle的,所以请不要混淆。之所以提出来,是因为它不是B树结构的索引。位图索引相对于Btree索引来说,它的存储结构是不一样的,通常在Btree索引中,索引条目和行之间有一对一的关系。对于位图索引,一个索引条目使用一个位图同时指向许多行。这对于基本上只读的低基数(数据只有很少的几个截然不同的值)数据是合适的。比如说,一个person表,有个性别字段sex,Y代表男,N代表女,对于有几百万行数据的表来说,位图索引是一个非常好的选择。它可以迅速的扫描出来,而不用象对B树索引那样的查找。