数据库的索引
索引
使用索引应遵循的基本原则
- 合理安排索引列
-
在create index语句中,列的排序会影响通过索引进行查询的性能,我们通常把最常用的列放在前面。
- 限制表中索引的数量
-
虽然Oracle对与索引的数量没有限制,但是我们不能滥用索引。如果索引过多,修改表中的数据时对索引|的更改的工作量会很大,效率也很低。
索引分类
- 单列索引与复合索引
- 一个索引可以由一个或多个列组成,用于创建索引的列被称为“索引列”
- 单列索引是基于单个列所创建的索引,复合索引是基于多列所创建的索引
- 唯一索引与非唯一索引
- 唯一索引是索引列值不能重复的索引,非唯一索引是索引列值可以重复的索引
- 无论是唯一索引还是非唯一索引,索引列都允许取NULL值
- 标准(B-tree index,B树) 索引
- 在使用CREATE INDEX语句创建索引时,默认创建的就是B树索引
- 位图索引
- 基数: 是指某个列可能拥有的不重复值的个数。例如,Sex列的基数为2 (性别只能是男或女)
索引的应用
- 创建索引的语法
例子:
--简单索引 create index emp__index on emp_index(empno);
注:对比查看有所以和没索引的查询
执行时间上
从上面两个图片中可以看出来执行有索引的查询耗费的时间更少一些,接下来点开解释计划窗口,再对比一下:
可以看得出来有索引的表的查询更快。
- 复合索引
-
如果SELECT语句中的WHERE子句引用了复合索引中的所有列或大多数列,则使用复合索引可以显著地提高查询速度。
-
创建此类索引时,应该注意定义中使用的列的顺序,通常,最频繁访问的列应该放置在列表的最前面。
create index 索引名 on 表名(列名1,列名2);
- 位图索引
-
由于emp表的job列、deptno列的取值范围有限,并且经常需要基于这些列进行查询统计、汇总工作,所以应该基于这些列创建位图索引。
create bitmap 索引名 on 表名(列名);
创建索引的原则
- 一般不需要为数据量很小的表创建索引。
-
对于数据量比较大的表,如果经常需要查询的记录数小于表中所有记录数的10%,则可以考虑为该表创建索引。
-
对于取值范围较大的列(如ename列),应该创建B树索引|; 对于取值范围较小的列(如sex列),应该创建位图索引。
.
-
对于包含很多个NULL值,但是经常需要查询所有非NULL值记录的列,应当创建索引。
- 不能在CLOB或BLOB等大对象数据类型列上创建索引。
-
如果大部分情况下只对表执行只读操作,可以为该表创建更多的索引以提高查询速度。
-
如果大部分情况下需要对表执行更新操作,则应该为该表少创建一些索引,以提高更新速度。