1、索引的概念
1)概念:Oracle数据库中的索引是一种建立在表或簇基础上的数据对象,和表一样具有独立的段存储结构,需要在表空间中为其分配存储空间。
2)作用:可以提高查询表中数据的速度。
2、索引的类型(面试题)
1)B树索引(考点):是应用最广泛的索引,也是Oracle数据库的默认索引类型。B树指的是平衡树(Balanced Tree),它是使用平衡算法来管理索引的。
适合B树索引的场合有:
- 表中存储的数据行数很多。
- 列中存储的数据的不同值很多。
- 查询的数据量不超过全部数据行的5%,否则应使用全表扫描。
2)位图索引:当要建立索引列的数据有大量的重复值时,如果在其上建立了B树索引,则那么叶块中就会存储大量相同的索引列值,反而会降低查询的速度。这种情况下就应该使用位图索引。
每一个索引列值都存储一个位图,该位图由二进制位组成。
3)反向键索引:是一种B树索引,它在物理上反转索引的列值,但是列的顺序保持不变。反向键索引通常建立在值是连续增长的列上,使数据均匀地分布在整个索引上,其目的是为了解决叶块争用问题。
l对于创建反向键索引的列,在执行查询操作时,Oracle数据库会自动将查询条件反转以与反向键索引匹配。如果在WHERE子句中使用范围查询条件,比如BETWEEN、<、>等,由于索引值被反转,不会按照原来的排序进行查询,查询时必须执行全表扫描,因此建立反向键索引的列不适合用于范围查询。
4)基于函数的索引:基于函数的索引会先对列的函数或表达式进行计算然后将计算的结果存入索引中。创建这种类型的索引时需要注意一下几点:
- 创建时必须具有 QUERY REWRITE系统权限。
- 表达式中不能出现聚合函数。
- 不能在LOB类型的列上创建。
5)唯一索引和非唯一索引(考点)
如果根据索引值是否可以相同,可以将索引分为唯一索引和非唯一索引。和唯一约束相近。
唯一索引是指索引值不重复的索引,也就是建立唯一索引的列上的任何两个值都不能相同。与唯一约束类似,唯一索引也允许列值为空值。当为列定义主键或唯一约束时会自动建立唯一索引。(如果并没有在表中创立唯一索引,但是表中有主键或唯一约束,那么就相当于建立了唯一索引)非唯一索引与唯一索引相反,表示允许建立索引的列上存在重复值。
6)单列索引和复合索引(考点)
单列索引就是建立的表的单一列上的索引,如果把表的多个列作为一个整体并在其上建立索引,则将所建的索引称为复合索引。
3、创建索引
语法:
create index index_name on table_name(字段名);
4、修改和重建索引
1)修改索引为反向键索引或普通索引
语法:
alter index index_name rebuild noreverse;//普通索引
alter index index_name rebuild reverse;//反向键索引
2)将索引重命名
语法:
alter index index_name rename to new_name;
3)将索引修改为压缩或非压缩
语法:
alter index index_name rebuild nocompress;//非压缩
alter index index_name rebuild compress;//压缩
4)将索引修改为写入重做日志文件或不写入重做日志文件
语法:
alter index index_name rebuild nologging;//不写入重做日志文件
alter index index_name rebuild logging;//写入重做日志文件
5)修改索引表空间
语法:
alter index index_name tablespace tablespace_name;
6)合并索引
语法:
alter index index_name coalesce;
5、删除索引
语法:
drop index index_name;
6、查看索引信息
1)可以通过以下的数据字典视图了解与用户相关的信息:
dba_indexes、all_indexes和user_indexes;dba_ind_columns、all_ind_columns和user_ind_columns;dba_ind_expressions、all_ind_expressions和user_ind_expressions。
7、索引与约束(面试题)
1)索引的作用除了加快查询速度,提高系统性能之外,另外一个重要的作用是为主键约束和唯一约束提供支持。(考点)
2)当创建主键约束和唯一约束时,Oracle数据库会自动在该列上创建唯一索引。
3)不仅是主键约束和唯一约束需要使用唯一索引,外键约束也需要。
8、何时使用索引(面试题)
1)索引主要有以下几个缺点:
-
创建索引和维护索引要耗费一定的时间,而且耗费的时间长度会随着数据量的增加而增加。
-
索引作为一个独立的数据对象需要占用一定的磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
-
当对表执行DML语句的时候,只要执行的SQL语句涉及到索引列,数据库就需要动态的更新索引,这就好比在word文件中修改内容之后必须刷新目录一样,这样就必然会降低数据的维护速度
2)创建和使用索引时要先看看是否符合以下的要求:
-
表的数据量一定要很大。
-
索引列的查询频率一定要高。
-
满足查询条件记录数不能很多。
-
在需要排序的列上创建索引。
-
可以在查询频率高的组合列上创建索引。
-
在多表连接查询中的连接列上创建索引。
-
不要在低基数的列上创建索引。
-
当需要对一个表频繁的进行增删改操作的时候,不应该为该表创建索引。
-
要限制在表上创建索引的数量。
-
在向数据库导入数据时,不要创建索引。
转载:https://blog.csdn.net/abc701110/article/details/105727375