oracle索引总结


Posted in Oracle onSeptember 25, 2021

一、简介

说明:

  1. 索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。
  2. 索引是建立在表上的可选对象;索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率
  3. 索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表;
  4. 索引一旦建立,在表上进行DML操作时(例如在执行插入、修改或者删除相关操作时),oracle会自动管理索引,索引删除,不会对表产生影响
  5. 索引对用户是透明的,无论表上是否有索引,sql语句的用法不变
  6. oracle创建主键时会自动在该列上创建索引

二、索引原理

  • 若没有索引,搜索某个记录时(例如查找name='wish')需要搜索所有的记录,因为不能保证只有一个wish,必须全部搜索一遍
  • 若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值哪找升序排列,然后构建索引条目(namerowid),存储到索引段中,查询namewish时即可直接查找对应地方
  • 创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引

三、索引使用(创建、修改、删除、查看)

1.创建索引语法

CREATE [UNIQUE] | [BITMAP] INDEX index_name  --unique表示唯一索引
ON table_name([column1 [ASC|DESC],column2    --bitmap,创建位图索引
[ASC|DESC],…] | [express])
[TABLESPACE tablespace_name]
[PCTFREE n1]                                 --指定索引在数据块中空闲空间
[STORAGE (INITIAL n2)]
[NOLOGGING]                                  --表示创建和重建索引时允许对表做DML操作,默认情况下不应该使用
[NOLINE]
[NOSORT];                                    --表示创建索引时不进行排序,默认不适用,如果数据已经是按照该索引顺序排列的可以使用

2.修改索引

1)重命名索引

alter index index_sno rename to bitmap_index;

2) 合并索引

(表使用一段时间后在索引中会产生碎片,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引方式更好些,无需额外存储空间,代价较低)

alter index index_sno coalesce;

3.重建索引

方式一:删除原来的索引,重新建立索引

方式二:

alter index index_sno rebuild;

3.删除索引

drop index index_sno;

4.查看索引

select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';

 -- eg:    
create index index_sno on student('name');
select * from all_indexes where table_name='student';

四、索引分类

1. B树索引

(默认索引,保存讲过排序过的索引列和对应的rowid值)

1)说明:

  1. oracle中最常用的索引;B树索引就是一颗二叉树;叶子节点(双向链表)包含索引列和指向表中每个匹配行的ROWID
  2. 所有叶子节点具有相同的深度,因而不管查询条件怎样,查询速度基本相同
  3. 能够适应精确查询、模糊查询和比较查询

2)分类:

   UNIQUE,NON-UNIQUE(默认),REVERSE KEY(数据列中的数据是反向存储的)

3)创建例子

craete index index_sno on student('sno');

4)适合使用场景:

列基数(列不重复值的个数)大时适合使用B数索引

2. 位图索引

1)说明:

1.创建位图索引时,oracle会扫描整张表,并为索引列的每个取值建立一个位图(位图中,对表中每一行使用一位(bit,0或者1)来标识该行是否包含该位图的索引列的取值,如果为1,表示对应的rowid所在的记录包含该位图索引列值),最后通过位图索引中的映射函数完成位到行的ROWID的转换

2)创建例子

create bitmap index index_sno on student(sno);

3) 适合场景:

对于基数小的列适合简历位图索引(例如性别等)

3.单列索引和复合索引(基于多个列创建)

1) 注意:

  即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引,即至少要包含组合索引的第一列

4. 函数索引

1)说明:

  1. 当经常要访问一些函数或者表达式时,可以将其存储在索引中,这样下次访问时,该值已经计算出来了,可以加快查询速度

  2. 函数索引既可以使用B数索引,也可以使用位图索引;当函数结果不确定时采用B树索引,结果是固定的某几个值时使用位图索引

  3. 函数索引中可以水泥用lentrimsubstrupper(每行返回独立结果),不能使用如summaxminavg

 2)例子:

create index fbi  on student (upper(name));
select * from student where upper(name) ='WISH';

五、索引建立原则总结

  1. 如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引
  2. 至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引)
  3. 小表不要简历索引
  4. 对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引
  5. 列中有很多空值,但经常查询该列上非空记录时应该建立索引
  6.  经常进行连接查询的列应该创建索引
  7. 使用create index时要将最常查询的列放在最前面
  8. LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引
  9. 限制表中索引的数量(创建索引耗费时间,并且随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度)

注意事项:

1. 通配符在搜索词首出现时,oracle不能使用索引,eg:

--我们在name上创建索引;

create index index_name on student('name');

--下面的方式oracle不适用name索引

select * from student where name like '%wish%';

--如果通配符出现在字符串的其他位置时,优化器能够利用索引;如下:

select * from student where name like 'wish%';

 2. 不要在索引列上使用not,可以采用其他方式代替如下:(oracle碰到not会停止使用索引,而采用全表扫描)

select * from student where not (score=100);

select * from student where score <> 100;

--替换为

select * from student where score>100 or score <100

 3. 索引上使用空值比较将停止使用索引, eg:

select * from student where score is not null;

到此这篇关于oracle索引总结的文章就介绍到这了,更多相关oracle索引内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
mybatis使用oracle进行添加数据的方法
Apr 27 Oracle
zabbix agent2 监控oracle数据库的方法
May 13 Oracle
Oracle 区块链表创建过程详解
May 15 Oracle
oracle覆盖导入dmp文件的2种方法
May 21 Oracle
ORACLE数据库应用开发的三十个注意事项
Jun 07 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
Oracle表空间与权限的深入讲解
Nov 17 Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 Oracle
Oracle数据库中通用的函数实例详解
Mar 25 Oracle
Oracle数据库事务的开启与结束详解
Jun 25 Oracle
Oracle中日期的使用方法实例
Jul 07 Oracle
Oracle 死锁的检测查询及处理
Sep 25 #Oracle
RPM包方式安装Oracle21c的方法详解
oracle连接ODBC sqlserver数据源的详细步骤
Oracle以逗号分隔的字符串拆分为多行数据实例详解
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
You might like
windows下安装php的memcache模块的方法
2015/04/07 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
js的三种继承方式详解
2017/01/21 Javascript
Angular4 中内置指令的基本用法
2017/07/31 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
python自动zip压缩目录的方法
2015/06/28 Python
python正则实现提取电话功能
2018/02/24 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
学习和使用python的13个理由
2019/07/30 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
学生逃课检讨书
2015/02/17 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
浅谈python中的多态
2021/06/15 Python
python3操作redis实现List列表实例
2021/08/04 Python