日期:2014-05-16  浏览次数:20625 次

\(^_^)/ 数据库索引

参考:http://txf2004.iteye.com/blog/1729935

参考:http://guoyankun.iteye.com/blog/1765898

参考:http://yanqingluo.iteye.com/blog/1781671

参考:http://huoli.iteye.com/blog/456799

参考:http://oracledba.iteye.com/blog/448579

?

?

?

?

?

?

?

概念:

使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。

在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

?

?

?

?

?

?

?

优点:

1.大大加快数据的检索速度;

2.创建唯一性索引,保证数据库表中每一行数据的唯一性;

3.加速表和表之间的连接;

4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

?

?

?

?

?

?

?

?

索引的缺点:

1.索引需要占物理空间。建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引。

2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

?

?

?

?

?

?

?

使用索引原则:

在大表上建立索引才有意义。

在where子句或是连接条件上经常饮用的列上建立索引。?

索引的层次不要超过4层。?

如果表主要是提供查询,那么在经常查询的字段上建立索引。

作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。

可以基于数据库表中的单列或多列创建索引。多列索引使您可以区分其中一列可能有相同值的行。

经常被用来搜索数据记录的字段

尽量不要为数据内容重复率很高的字段创建索引,它所带来的效益很少?

数据记录越多,索引提高数据访问的效率的幅度就越明显?

?

?

?

?

?

?

?

?

确定索引的有效性:

1.检查查询的 WHERE 和 JOIN 子句。在任一子句中包括的每一列都是索引可以选择的对象。

2.对新索引进行试验以检查它对运行查询性能的影响。

3.考虑已在表上创建的索引数量。最好避免在单个表上有很多索引。

4.检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引。

5.检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比较的结果就是该列的可选择性,这有助于确定该列是否适合建立索引,如果适合,确定索引的类型。

6.查询操作中的order by 语句的数据排序,group by 语句的数据分组,连接表

?

?

?

?

?

?

?

?

?

索引的分类:

1.普通索引(INDEX):这是最基本的索引类型,它没有唯一性之类的限制。创建普通索引的关键字是INDEX。create index 索引名 on 表名(字段名,。。。);

2.唯一性索引(UNIQUE):在一个表上可以创建多个,索引值不能重复。允许有空值。create unique index 索引名 on表名(字段名,。。。)

3.主键索引(PRIMARY KEY):在一个表上只能创建一个主键,主键字段不能出现重复值,不允许为空。

4.全文索引(FULLTEXT):create fulltext index 索引名 on 表名(字段名,。。。);

5.聚集索引:在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。

?

按存储结构分:聚集索引,非聚集索引?

按照数据存储方式:可以分为B*树、反向索引、位图索引。?

按照索引列的个数分类:可以分为单列索引、复合索引。?

按照索引列值的唯一性:可以分为唯一索引和非唯一索引。?

此外还有函数索引,全局索引,分区索引,函数索引

?

逻辑上:

Single column 单行索引

Concatenated 多行索引

Unique 唯一索引

NonUnique 非唯一索引

Function-based函数索引

Domain 域索引

?

物理上:

Partitioned 分区索引

NonPartitioned 非分区索引

B-tree:

Normal 正常型B树

Rever Key 反转型B树?

Bitmap 位图索引

?

?

?

?

?

?

?

?

?

?

主键一唯一索引的区别:

1 一个表的主键只能有一个,而唯一索引可以建多个。

2 主键可以作为其它表的外键。

3 主键不可为null,唯一索引可以为null。

?

?

?

?

?

?

?

?

?

适合使用聚集索引的情况:?

1 如果某字段所包含的有差别的数据的数目有限,则非常适合为该字段创建聚集索引?

2 使用betwwen,>,<,>=与<=等运算符返回介于特定范围的数据记录的查询?

3 按照特定次序访问的字段?

4 返回大量结果集的查询?

5 经常用于查询的连接条件或group by语句的字段?

6 使用聚集索引搜索为一键列的速度一非常快?

?

?

?

?

?

?

?

?

索引的结构:

?

B-tree索引:

基于二叉树的,由分支块(branch block)和叶块(leaf block)组成。

默认情况下大多使用Btree索引,该索引就是通常所见 唯一索引、聚簇索引等等。

适合与大量的增、删、改(OLTP);

不能用包含OR操作符的查询;

适合高基数的列(唯一值多)

典型的树状结构;

每个结点都是数据块;

大多都是物理上一层、两层或三层不定,逻辑上三层;

叶子块数据是排序的,从左向右递增;

在分支块和根块中放的是索引的范围;

但当检查的范围超过表的10%时就不能提高取回数据的性能。

反向索引,降序索引。

?

Bitmap索引:

适合与决策支持系统,OLAP(联机数据分析)方面,数据仓库方面,或静态数据,不支持行级锁定。

做UPDATE代价非常高;

非常适合OR操作符的查询;?

基数比较少的时候才能建位图索引,用于低cardinality列(即列的唯一值除以行数为一个很小的值,接近零)。

位图以一种压缩格式存放,节省存储空间。

在索引中使用位图而不是列值,使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)、或NULL值。

通常在事实表和维表的键之间有很低的集的势(cardinality),使用位图索引,存储更为有效。

位图索引将比较,连接和聚集都变成了位算术运算,大大减少了运行时间,从而得到性能上的极大的提升。

?