oracle学习笔记(二十五):索引


什么是索引(index)?

1、索引是一种快速查询表中内容的机制,类似于新华字典的目录;

2、运用在表中某个/些字段上,但存储时,独立于表之外(表消亡了,索引还在,但是没有意义了);

 

为什么要用索引?

1、通过指针加速 oracle 的查询速度;

2、通过 rowid 快速定位数据的方法,减少磁盘 I/O;

 

rowid 的特点:

1、rowid 是 oracle 中唯一确定每张表不同记录的唯一身份证;

2、rowid 位于每个表中,但表面上看不见,例如:desc emp; 是看不见的;

3、只有在 select 语句中,显式写出 rowid 才能看见;(和 rownum 很类似)

oracle学习笔记(二十五):索引

4、他与每个表绑定在一起,表亡,rowid 消失;二张表的 rownum 可以相同,但 rowid 必须是唯一的;

5、rowid 是 18 位大小写加数字的 混合体,唯一代表该记录在 DBF 文件中的位置;

6、rowid 可以参与 =/like 比较,用单引号('')将 rowid 的值包起来,且区分大小写;

oracle学习笔记(二十五):索引

7、rowid 是联系表与 DBF 文件的桥梁;

 

 

索引的特点:

1、索引一旦建立,oracle  会对其进行自动维护,而且由 oracle 管理系统决定何时使用索引;

2、用户不用在查询语句中指定使用哪个索引;

3、在定义 primary key 或 unique 约束后,oracle 系统自动在相应的列上建立索引;

4、用户也能按自己的需求,对单个字段,或多个字段,添加索引;

 

什么时候 要 创建索引?

1、表经常进行 select 查询;

2、表很大,记录很多,记录内容分布范围很广;

3、列名经常在 where 子句,或连接条件中出现;

符合上面某一条要求,都可创建索引,创建索引是一个优化问题,同样也是一个策略问题;

 

什么时候 不要 创建索引?

1、表经常进行 insert/update/delete 操作;

2、表很小,记录超少;

3、列名不经常作为连接条件,或出现在 where 子句中;

 

1、为 emp 表的 empno 单个字段,创建索引 emp_empno_idx,叫单列索引,语法:create index 索引名 on 表名(字段,...)

oracle学习笔记(二十五):索引

2、使用单例索引:根据 empno 列创建的索引,当 empno 列出现在 where 子句的时候,就会使用索引(oracle 自动使用)

oracle学习笔记(二十五):索引

3、为 emp 表的 ename,job 多个字段,创建索引 emp_ename_job_idx,叫做 多列索引(也叫联合索引):

oracle学习笔记(二十五):索引

4、使用 多列索引:由于索引是根据 ename 和 job 字段创建的,所以如果 where 子句中出现 ename 和 job,就会使用索引;

oracle学习笔记(二十五):索引

如果 where 子句中只出现 ename(创建索引的 第一个字段),也会使用索引;

但是如果 where 子句中只出现 job(创建索引的 后面的字段,即不是第一个字段),就不会使用索引;

推荐 where 子句中同时出现 ename 和 job 字段;

5、查看已经创建的索引: select * from user_indexes;

查看索引和查看序列类似,区别于查看 表、视图、同义词 的 select * from tab 语句;

由于索引的列数太多,所以我只查询了一部分列:

oracle学习笔记(二十五):索引

4、 删除索引:drop index 索引名;

oracle学习笔记(二十五):索引