1.基础知识:

索引是一种数据结构,是为了更快速的访问到数据。
索引是各种关系数据库系统最常见的一种逻辑单元,是关系数据库系统举足轻重的重要组成部分,对于提高检索数据速度有着至关重要的作用,索引的原理是根据索引值得到行指针(ROWID),然后快速定位到数据库记录。就像一本字典的目录一样,我们去找一个字的时候也不可能从第一页找到最后一页,我们也是在目录中根据拼音或者部首去查询这个字所在的页数范围。索引就相当于书或者字典的目录。

2.基础用法

--创建索引
CREATE [UNIQUE] INDEX <索引名>
ON <基本表名> (<列名> [<次序>],[,<列名> [<次序>]]…); 
--说明:
--UNIQUE:规定索引的每一个索引值只对应于表中的唯一记录。
--<次序>:建立索引时指定列名的索引表是ASC(升序)或DESC(降序)。

--索引的创建语句(简洁)
create index 索引名 on 表名(列名);

--标准语法
create index 索引名 on 表名(列名) tablespace 表空间名;

--tablespace 表空间名 可以省略,以下皆省略

--创建唯一索引
create unique index 索引名 on 表名(列名);

--复合索引/组合索引
create index 索引名 on 表名(列名1, 列名2, 列名3, ...);

--反向键索引
create index 索引名 on 表名(列名) reverse;

--删除索引
drop index 索引名 on 表名;

--降序索引​
​CREATE INDEX 索引名 ON 表名(列名 desc) ;  --升序asc

--查看某个表中的所有索引
select * from all_indexes where table_name = '表名'

--查看某个表中建立了索引的所有列
​select * from all_ind_columns where table_name = '表名'


​

3.索引的建立原则

1.索引是一种用空间换时间的手段,索引和表一样,同样需要占用磁盘空间。索引应该建立在WHERE子句中经常使用的列上。如果某个大表经常使用某个字段进行查询,并且检索的行数小于总表行数的5%,则应该考虑在该列上建立索引;且建立索引注意字段顺序。

2.对于两个表连接的字段,应该建立索引。

3.如果经常在某表的一个字段上进行Order By的话,则也应该在这个列上建立索引。

4.不应该在小表上建立索引。

5.索引一定要在建表的时候考虑创建。因为刚开始时数据量少,在低效的SQL也不会体现出问题的存在,在数据慢慢增长到一定规模时候,这个时候再去创建索引将会面临很多问题,比如创建索引花费的时间变长,创建索引会对表内数据加锁,即使加了ONLINE参数也不能解决这一问题,所以这里主要是对业务产生影响,数据无法进行DML操作,影响的时长就是创建索引的时长。

4.索引的优缺点

索引主要是为了提高数据的查询速度,这就是索引的优点。但是当进行增删改的时候,会更新索引。因此索引越多,增删改的速度就会越慢,因为有一个维护索引的过程。创建索引之前需要权衡该字段是否经常发生增删改操作,否则可能会带来负优化的问题。

索引的优点

1.很大地提高了数据的检索速度。

2.创建唯一索引能保证数据库表中每一行数据的唯一性(唯一性约束)。

3.提高表与表之间的连接速度。

索引的缺点

1.索引需要占用物理空间。

2.当对表中的数据进行增加、删除和修改的时候,索引也要动态地进行维护,降低数据的维护速度。

5.关于查询优化器

当Oracle拿到SQL语句的时候,会使用查询优化器去分析该语句,并根据分析结果生成查询执行计划。也就是说,是数据库执行的查询计划,而不是SQL语句。

查询优化器有RBO(Rule-Based-Optimizer,基于规则的查询优化器)和CBO(Cost-Based-Optimizer,基于成本的查询优化器),其中基于规则的查询优化器在10g的版本中彻底消失了。原因是因为RBO最后的查询都是全表扫描,而CBO会根据统计信息选择最优的查询方案。

因此,CBO一旦发现有索引的存在,并且这个索引能帮助提高查询速度,就是使用通过索引进行查询的方法。

6.参考

1.oracle创建索引_榴莲豆包的博客-CSDN博客_oracle 创建索引

2.使用索引详解(拓展):

2.1ORACLE创建索引思路_fiendbaal的博客-CSDN博客_oracle多个查询条件怎么建索引

2.2Oracle索引详解_D2cOneluo的博客-CSDN博客_oracle 索引

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐