索引:
一种数据库对象
通过指针加速Oracle 服务器的查询速度
通过快速定位数据的方法,减少磁盘I/O
索引与表相互独立
Oracle服务器自动使用和维护索引
索引说明:
1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的目录。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。
2)索引是建立在表上的可选对象;索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率
3)索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表
4)索引一旦建立,在表上进行DML操作时(例如在执行插入、修改或者删除相关操作时),oracle会自动管理索引,索引删除,不会对表产生影响
5)索引对用户是透明的,无论表上是否有索引,sql语句的用法不变
6)oracle创建主键时会自动在该列上创建索引
索引原理
1.若没有索引,搜索某个记录时(例如查找name=‘wish’)需要搜索所有的记录, 因为不能保证只有一个wish,必须全部搜索一遍
2.若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值排列, 然后构建索引条目(name和rowid),存储到索引段中, 查询name为wish时即可直接查找对应地方
3.创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引, 表中数据很少时使用全表扫描速度已经很快,没有必要使用索引
创建索引
自动创建: 在定义 PRIMARY KEY 或 UNIQUE 约束后系 统自动在相应的列上创建唯一性索引
手动创建: 用户可以在其它列上创建非唯一的索引,以 加速查询
在一个或多个列上创建索引
CREATE INDEX index1
ON table (column[, column]…);
1.单列索引
create index 索引名 on 表名(列名1,列名2… 列名32)
create index pname_index on p (ename)
–索引不需要主动使用,查询时字段使用了索引
例:select * from p where ename='SMITH’
2.多列索引
create index p_index on p (empno,ename)
– 注意使用复合索引时 列的顺序要一致 否则就不会使用所创建的索引
–如下是有索引顺序如下索引(select 时先sname 后 empno,顺序乱不可以)
例:select * from p where ename=‘SMITH’ and empno=7369
什么时候创建索引
以下情况可以创建索引:
列中数据值分布范围很广
列中包含大量空值
列经常在WHERE 子句或连接条件中出现
表经常被访问而且数据量很大,访问的数据大概占数 据总量的2%到4%
什么时候不要创建索引
下列情况不要创建索引:
表很小
列不经常作为连接条件或出现在WHERE子句中
表经常更新
加索引的列包含在表达式中
查询索引
可以使用数据字典视图USER_INDEXES 和 USER_IND_COLUMNS 查看索引的信息
修改索引
alter index 索引名 rename to 新 索引名
例:alter index p_index rename to pp_index
删除索引
使用DROP INDEX 命令删除索引
DROP INDEX index;
例:删除索引UPPER_LAST_NAME_IDX
DROP INDEX upper_last_name_idx;
只有索引的拥有者或拥有DROP ANY INDEX权限的用 户才可以删除索引