Oracle--索引

文章目录

一、索引是什么?

索引(INDEX)是数据库中用于提高查询效率的一种数据结构。它可以加速数据库表的数据查找、过滤和排序等操作。索引是一种类似于字典的数据结构,用于快速查找表中的某个值,类似于书本中的目录页,可以帮助用户快速找到所需内容。

二、索引的原理

Oracle 中的索引是基于 B-Tree 数据结构实现的,也称为 B-Tree 索引。B-Tree 索引是一种多层索引的树型结构,用于提高查询和检索操作的效率,为了优化查询性能,索引应针对经常被查询的列创建。查询过程中,数据库会首先检查查询条件中涉及的列是否有相关的索引,然后使用这些索引来快速定位、过滤和排序查询结果,从而大大提高查询效率。

如:

查询 EMPLOYEES表的所有内容

select * from EMPLOYEES;

不加索引读,一行一行的读,并且随机读,在读的过程中有可能会遇到有些列的值比较长,影响查询效率。

加了索引后,假如索引列为employee_id

索引就由rowid+employee_id组成

加了索引后, 通过索引,可以快速定位到包含特定值或满足特定条件的数据行,而 ROWID 提供了对这些数据行的直接引用。 当执行查询时,如果满足索引条件,Oracle 数据库引擎会使用索引来查找对应的 ROWID,然后利用 ROWID 直接访问和获取相应的数据行。由于索引的结构通常更小且更容易扫描,这种方式可以提高查询的效率。

三、索引的特征

1.快速检索 :通过索引,可以快速定位到包含特定值或满足特定条件的数据行,避免全表扫描和数据的多次IO操作,提高查询的效率。

2.占用空间 :索引需要占用一定的存储空间,以存储索引键和指向对应数据行的指针。随着索引的增多,可能会增加数据库的存储需求,索引是模式对象SCHEMA.OBJECT它高于数据对象。和表一样索引也有自己的段结构

3.对数据更新的影响 :每次对数据表的更新(插入、删除、修改)都会影响与之相关的索引表,因此会增加维护索引的成本

4.索引和索引所在的表无关

5.ORACLE自身进行自动使用和维护

在下列情况下应该创建索引

1.经常被查询的列:对于经常被查询的列,例如常用的查询条件、连接条件或排序列,可以创建索引以加快相关查询的速度。

2.列包含较大范围的值

3.在where子句或联结条件中频繁使用一个列或者多个列

4.表很大 但是语句多数查询检索的行不到表中枢的百分之二至百分之四

5.排序和分组操作:如果经常进行排序或分组操作,可以创建索引来加速这些操作

在下列情况下不应该创建索引,通常不值得创建索引

1.表比较小

2.在查询中不经常使用列作为条件

3.语句多数查询检索的数据行要超过表总数的百分之二至百分之四

4.表更新比较频繁 因为索引页跟着一起进行频繁更新

5.被索引的列将作为表达式的一部分进行引用 比如说对这个列进行函数操作 函数会导致索引出问题

当表比较小的时候,全表扫描的速度会高于索引参与查询的速度。

四、创建索引的方式

在 Oracle 数据库中,可以使用以下两种方式创建索引:隐式创建 (自动创建)和显式创建(手动创建)。

隐式创建(自动创建)索引:当定义了主键约束或唯一键约束时,Oracle 会自动为相应的列创建唯一索引。例如,创建名为 students 的表,并定义 id 列为主键,代码如下:

cpp 复制代码
CREATE TABLE students ( id NUMBER PRIMARY KEY, name VARCHAR2(50), ... );

在上述示例中,id 列作为主键,会自动创建一个唯一索引。

显式创建(手动创建)索引:用户可以根据需要手动创建非唯一索引,以加速对数据的检索访问。使用 CREATE INDEX 语句可以实现显式创建索引的操作。例如,为名为 students 的表的 name 列创建一个非唯一索引,可以使用以下 SQL 语句:

cpp 复制代码
CREATE INDEX idx_students_name ON students(name);

在上述示例中,idx_students_name 是索引的名称,students 是表的名称,name 列是要创建索引的列名。

五、怎么确认索引

1.查询执行计划:在数据库管理系统中,可以使用查询执行计划(query execution plan)来查看查询的执行过程,包括使用的索引和执行的操作。通过查询执行计划,可以确认是否使用了索引以及索引的效果。

2.行数和响应时间:可以对比使用索引和不使用索引的情况下,对同一个查询语句的执行时间和返回结果的行数进行对比。如果使用了索引,查询的响应时间可能更短,返回结果的行数可能更少。

3.相关视图

USER_INDEXES 数据字典视图包含索引的名称以及唯一性

USER_IND_COLUMNS 该数据字典视图包含索引名 表名 和 列名

4.查询当前的SCHEMA有哪些索引

cpp 复制代码
SELECT IC.INDEX_NAME,IC.COLUMN_NAME,IC.COLUMN_POSITION COL_POS,ix.uniqueness
FROM user_indexes ix ,user_ind_columns ic
WHERE IC.INDEX_NAME=IX.INDEX_NAME
AND IC.TABLE_NAME=IX.TABLE_NAME;

六、案列

1.创建一个表DEPTS

cpp 复制代码
create table DEPTS as select * from DEPARTMENTS where 1=1;
select * from DEPTS;

2.创建索引DEPTS_DEPARTMENT_ID_IDX

cpp 复制代码
CREATE INDEX DEPTS_DEPARTMENT_ID_IDX ON DEPTS(DEPARTMENT_ID);

3.查询当前SCHEMA索引是否存在DEPTS_DEPARTMENT_ID_IDX

cpp 复制代码
SELECT IC.INDEX_NAME,IC.COLUMN_NAME,IC.COLUMN_POSITION COL_POS,ix.uniqueness
FROM user_indexes ix ,user_ind_columns ic
WHERE IC.INDEX_NAME=IX.INDEX_NAME
AND IC.TABLE_NAME=IX.TABLE_NAME;
  1. 打开 Autotrace (SET AUTOTRACE ON )功能, 获取 SQL 查询语句执行的详细统计信息,包括查询的执行计划。

set autotrace on

select department_id from hr.DEPTS where department_id =10 ;

基于函数的索引

创建语句

cpp 复制代码
CREATE INDEX upper_dept_name_idx on depts(UPPER(DEPARTMENT_NAME));

查看是否创建索引成功

cpp 复制代码
SELECT * FROM DEPTS WHERE UPPER(DEPARTMENT_NAME)='SALES';

删除索引

cpp 复制代码
DROP INDEX upper_dept_name_idx;

扩展:

在对数据库表进行索引设计和优化时,不能简单地认为加上索引就能提高数据库性能,或者创建了索引之后就能一直有效。

数据库表的数据量、表结构、查询语句等因素都会影响索引的有效性和对查询性能的影响。索引设计需要根据实际应用场景和查询需求,综合考虑优化数据库性能的多个方面,例如查询频率、查询复杂度、并发访问等。此外,要根据表结构、数据分布、数据类型等因素选择适合的索引类型和创建方式,以避免索引滥用和不必要的资源浪费。

七、复合索引

复合索引是在数据库表中使用多个列作为索引键的索引类型。它可以提高在多个列上进行查询或排序的性能。

假设我们有一个名为 "employees" 的表,其中包含以下列:employee_id、first_name、last_name 和 department_id。现在,我们希望在 first_name 和 last_name 列上创建一个复合索引。

创建复合索引:

cpp 复制代码
CREATE INDEX idx_employees_name ON hr.employees (first_name, last_name);

创建了复合索引后,数据库会在 first_name 和 last_name 列上建立一个索引数据结构,这样在查询或排序时可以更高效地访问数据。

使用复合索引的好处是可以加快根据多个列的条件进行过滤的查询。例如,下面的查询将会受益于复合索引:

cpp 复制代码
SELECT * FROM HR.employees WHERE first_name = 'Steven' AND last_name = 'King';
相关推荐
PGCCC1 小时前
【PGCCC】Postgresql 存储设计
数据库·postgresql
PcVue China3 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
魔道不误砍柴功5 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
锐策5 小时前
〔 MySQL 〕数据库基础
数据库·mysql
远歌已逝6 小时前
管理Oracle实例(二)
数据库·oracle
日月星宿~6 小时前
【MySQL】summary
数据库·mysql
爱吃土豆的程序员6 小时前
在oracle官网下载资源显示400 Bad Request Request Header Or Cookie Too Large 解决办法
java·数据库·oracle·cookie
睿思达DBA_WGX6 小时前
Oracle 11g rac 集群节点的修复过程
数据库·oracle
尘浮生6 小时前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序
Leo.yuan7 小时前
数据量大Excel卡顿严重?选对报表工具提高10倍效率
数据库·数据分析·数据可视化·powerbi