索引是一个单独的、物理的数据库结构,用于从表中更快地检索行。它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。供用户快速查找到记录的数据库结构。Oracle中主要有簇索引、表索引、位图索引三种索引形式。
注意作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。在多数情况下,索引用于数据检索的速度优势大大超过它的不足之处。但是,如果应用程序非常频繁地更新数据或磁盘空间有限,则可能需要限制索引的数量。
表索引的建立
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名> ( <列名>[<次序>][,<列名>[<次序>]]...);
其中,<表名>指定要建索引的基本表的名字。索引可以建在该表的一列或多列上,各列名之间用逗号分隔。每个<列名>后面还可以用<次序>指定索引值的排列次序,包括ASC(升序)和DESC(降序)两种,缺省值为ASC。
例 CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
二、索引的特点
1.索引可以加快数据库的检索速度
2.索引降低了数据库插入、修改、删除等维护任务的速度
3.索引创建在表上,不能创建在视图上
4.可以在优化隐藏中,使用索引
5.使用查询处理器执行SQL语句,在一个表上,一次只能使用一个索引
三、索引的优点
1.创建唯一性索引,保证数据库表中每一行数据的唯一性
2.大大加快数据的检索速度,这也是创建索引的最主要的原因
3.加速表和表之间的连接。
4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5.通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。
四、索引的缺点
1.创建索引和维护索引要耗费时间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度;
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
六、索引的使用
1.当字段数据更新频率较低,查询使用频率较高并且存在大量重复值是建议使用聚簇索引
2.经常同时存取多列,且每列都含有重复值可考虑建立组合索引
五、 索引类型
根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。
与非聚集索引相比,聚集索引通常提供更快的数据访问速度。对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序(把记录的物理位置按索引列排列),而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引。
B*Tree索引:默认建立的索引就是这种类型的索引。常规索引,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。
反向索引是为了降低在并行服务器环境下索引叶块的争用。Create index indexname on tablename(columnname[columnname...]) reverse
降序索引是列在索引中的储存方式从升序变成了降序,在某些场合下降序索引将会起作用。Create index indexname on tablename(columnname DESC[columnname...])
位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引最好用于低cardinality列,例如又一个“性别”列,列值有“Male”,“Female”,“Null”等3种,但一共有300万条记录,那么3/3000000约等于0,这种情况下最适合用位图索引。Create BITMAP index indexname on tablename(columnname[columnname...])
函数索引。Create index indexname on tablename(functionname(columnname))
删除索引 drop index indexname;
[4] 限制索引
在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题:
1 使用不等于操作符(<>、!=)
特别注意:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。
2 使用IS NULL 或IS NOT NULL
使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。
3 使用函数
如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
4 比较不匹配的数据类型
特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用。