SQL查询--索引
索引概念和作用
索引是建立在表上的可选对象,目的是为了提高查询速度。
如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的ROWID快速找到表中对应的记录。
例如,如果将表看做一本书,索引的作用类似于书中的目录。在没有目录的情况下,要在书中查找指定的内容必须阅读全文,而有了目录之后,只需要通过目录就可以快速找到包含所需内容的页码(相当于ROWID)
索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率。
索引在逻辑上和物理上都与相关的表的数据无关,当创建或删除一个索引时,不会影响基本的表、数据库应用或其他索引,当插入、更改和删除相关的表记录时,Oracle会自动管理所引,如果删除索引,所有的应用仍然可以继续工作。因此在表上一列或多列创建索引不会对表的使用产生任何影响,但是,可以提高检索速度。
索引一旦建立后,当在表上进行DML操作时,Oracle会自动维护索引,并决定何时使用索引。
索引的使用对用户是透明的,用户不需要再执行SQL语句时指定使用哪个索引以及如何使用索引。索引只与系统性能相关。
索引原理
![](https://img2018.cnblogs.com/blog/1158674/201908/1158674-20190831091506911-1404798155.png)
索引的类型
可以按照列的多少、索引值是否唯一、索引数据的组织形式对索引进行分类,以满足各种表和查询条件的要求:
1、单列索引和复合索引
一个索引可以由一个或多个列组成,基于单个列所创建的索引称为单列索引,基于两列或多列所创建的索引称为多列索引。
2、B树索引
B树索引是Oracle中最常用的一种索引。当用 create index 语句创建索引时,默认创建的索引就是B树索引。
B树索引是按照B树结构或使用B树算法组织并存储索引数据的,B树索引就是一棵二叉树,它由根、分支节点和叶子节点三部分构成。其中,根包含指向分支节点的信息,分支节点包含指向下级分支节点和指向叶子节点的信息,叶子节点包含索引列和指向表中每个匹配行的ROWID值。叶子节点是一个双向链表,因此可以对其进行任何方面的范围扫描。
![](https://img2018.cnblogs.com/blog/1158674/201908/1158674-20190831091556380-87303943.png)
3、位图索引
在B树索引中,保存的是经过排序的索引即其对应的ROWID值,但是对于一些基数很小的列来说,这样做并不能显著提高查询的速度。所谓基数,是指某个列可能拥有的不重复值得个数。比如性别列的基数为2(只有男和女)
因此,对于像性别、婚姻状况、政治面貌等只有几个固定值的字段而言,如果要建立索引,应该建立位图索引,而不是默认的B树索引。
![](https://img2018.cnblogs.com/blog/1158674/201908/1158674-20190831091625069-561561250.png)
4、函数索引
Oracle还可以对包含有列的函数或表达式创建索引,这就是函数索引。
当需要经常访问一些函数或表达式时,可以将其存储在索引中,当下次访问时,由于该值已经计算出来了,因此,可以大大提高那些在 where 字句中包含该函数或表达式的查询操作的速度。
![](https://img2018.cnblogs.com/blog/1158674/201908/1158674-20190831091651862-1024354283.png)
管理索引的原则
![](https://img2018.cnblogs.com/blog/1158674/201908/1158674-20190831091747744-824334232.png)
创建索引
创建索引使用create index语句
![](https://img2018.cnblogs.com/blog/1158674/201908/1158674-20190831091813556-758433925.png)
可以在一个表上创建多个索引,但这些索引的列的组合必须不同,如下:
create index idx1 on sales(id,topic);
create index idx2 on sales(topic,id);
其中,idx1和idx2索引都使用了id和topic列,但由于顺序不同,因此是合法的。
创建B树索引
B树索引是Oracle默认的索引类型,例如在 sales 表的 topic 列上按标题查询,可以在 topic 列上建立B树索引
create index idx_name on sales(topic); 单列索引 CREATE INDEX idx_name ON sales(job,sal); 复合索引
创建位图索引
以sales表的islook列(基数为2,只有2个值,Y或N)创建位图索引
create bitmap index idx_name on sales(islook);
(其实创建了索引并不一定就会使用,Oracle在自动搜集了表和索引的统计信息后,会决定是否使用索引,如果表数据太少,就可以直接全表扫描,不必使用索引)
创建函数索引
![](https://img2018.cnblogs.com/blog/1158674/201908/1158674-20190831091841384-1958602066.png)
CREATE INDEX idx_name ON sales(UPPER(topic));
重命名索引
alter index idx_name1 rename to idx_name2;
删除索引
![](https://img2018.cnblogs.com/blog/1158674/201908/1158674-20190831091849872-1291713444.png)
drop index idx_name;
重建索引
alter index idx_name rebuild;
合并索引
alter index idx_name coalesce;
![](https://img2018.cnblogs.com/blog/1158674/201908/1158674-20190831091859824-1378088374.png)
查询索引
用user_indexes和user_ind_columns系统表查看已经存在的索引 user_indexes: 系统视图存放是索引的名称以及该索引是否是唯一索引等信息。 user_ind_column: 系统视图存放的是索引名称,对应的表和列等。
基本查询: select * from user_indexes; select * from user_ind_columns; 关联查询: select i.index_name, i.index_type, i.table_owner, i.table_name, i.uniqueness, i.tablespace_name, c.column_name, c.column_position, c.column_length from user_indexes i, user_ind_columns c where i.index_name = c.index_name; 也可以用all_indexes表查询 select index_name,index_type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';
以上内容来自慕课网的相关教程