1、索引概念
1、是一个单独的、物理的数据库对象
2、用于存放表中每一条记录的位置的对象。
3、在创建索引时,先要对索引字段进行排序。
4、索引由Oracle自动维护
索引就相当于目录。
索引包含两列:
1、索引字段(首先要进行排序)
2、uid字段
2、索引的优缺点
优点:提高查询速度
缺点:创建和维护索引需要时间;索引需要物理空间,随着数据量的增大而增大;
索引的好处就是查询快,目的就是提高查询效率。
索引由oracle自动维护,在操作(增删查)之后就会自动进行维护。
3、索引分类(简单了解)
按照索引数据的存储方式可以将索引分为B树索引、位图索引、函数索引、簇索引、反序索引等。
按照索引列的唯一性又可以分为唯一索引和非唯一索引
按照索引列的个数索引可以分为单列索引和复合索引
一般的普通索引都是B树索引。
4、创建索引
1、自动创建:通过约束,系统创建
主键约束和唯一约束系统会自动创建索引。
2、手工创建:
create [unique] [bitmap] index index_name on table_name(column_name) [reverse] [tablespace tablespace_name]
手工创建索引又分为三类:创建B树索引、创建基于函数的索引、创建复合索引。
创建B树索引
create index idx_ename on emp(ename);
创建索引
select * from emp where sal>2000;
这个索引的建立不会提高该语句查询的速度,因为创建的索引没有应用到查询中去。
select * from emp where ename=‘smith’;
这个索引的建立会提高该语句查询的速度,因为创建的索引中的ename应用到了查询语句中去了。
默认情况下,创建的索引是不唯一索引。
创建基于函数的索引
create index idx_lower on emp(lower(ename));
创建索引
select * from emp where ename=‘smith’;
索引在这个查询中不起作用
select * from emp where lower(ename)=‘smith’;
索引在这个查询中起作用
创建复合索引
create index idx_js on emp(job,sal);
创建索引
select * from emp where job=‘sales’ and sal>2000;
索引在这个查询中起作用
select * from emp where sal>2000 and job=‘sales’;
索引在这个查询中不起作用
对于复合索引,索引先按照job进行排序,在进行sal的排序
创建复合索引中的字段顺序要与查询时字段的顺序保持一致,索引才起作用。
select * from emp where job='sales';
索引在这个查询中起作用
select * from emp where sal>2000;
索引在这个查询中不起作用,因为先根据job排序后再用sal排序。
使用sql developer 创建索引:
一个创建索引页面只能创建一个索引。
5、查看索引
查看索引基本上都是通过数据字典进行查询的。
数据字典三类:all_,user_,dba_
使用数据字典user_indexes,查看当前用户下所建立的索引。
查看表结构:
desc user_indexes;
查看索引:
select index_name, index_type , table_name, tablespace_name from user_indexes;
normal表示普通索引,Function_based normal是基于函数的索引。
查看相应的列:
select * from user_ind_columns;
6、修改索引
修改索引,一般是两个操作:重命名、删除
重命名索引:
1、alter index idx_lower rename to lower_idx;
将索引名 idx_lower修改为 lower_idx
2、rename lower_idx to idx_lower;
这种重命名索引的方法不正确,会提示lower_idx不存在,这是因为rename不适合索引。
rename用于视图或者表的重命名操作。 例:rename emp to ee;
7、删除索引
删除索引与索引创建时采用的方式有关:
1、手动创建的索引,通过命令删除
drop index index_name;
2、自动创建的索引
通过禁用约束或删除约束的方式来删除对应的索引。
删除表,则会完全删除所有索引
例:drop index pk_dept;
提示:无法删除用于强制唯一/主键约束
因为不能够通过命令删除自动创建的索引。