尝试用最少的字数介绍oracle的几种常用索引原理,主要是想简单分析其存储结构来说明其检索方式,和解释为什们某种索引使用与某种场合。(数据结构中最简单的ArrayList和LinkedList的使用场景)。阐述原因只有一个,就是因为其存储结构决定的。

B树索引(默认类型)

存储结构:

B+树,不多描述。和其他几种关系数据库一样,就是根据索引列(一个或多个)来构造一个B+树来存储索引。非叶子节点两个区域:存储下级子节点的值的范围,和到对应子节点地址(典型B+树的结构),主要作用是导航;叶子节点存储索引的键值和行的ROWID。另外,索引的叶子节点间构成了一个双向链表。类似mysql的myisam引擎的辅助索引,也类似mssql的非聚集索引。

检索方式:

典型的平衡树的检索,栋根节点开始导航,选择下一个中间节点,直到找到对应的叶节点。需要说明的是,如果检索的所有列都在是索引中,则不用不用检索表,被称为Fast Full Index Scan;如果检索的列不都包含在索引中,则从树上找到索引列对应的key的叶子节点,需要根据其对应的ROWID,再次访问表,根据ROWID关联到其他属性。当Index Range Scan这种检索索引列的某个范围,则不用从根节点开始导航,直接选定开始的叶节点后,直接从叶节点的双向链表就可以完成。只需从根节点导航一次,找到开始的叶节点。

B+树是一个balance树,所有的叶子都在同一层上,无论根据索引查找表中的哪一条记录,where columnIndex=selectValue中间导航的层数都是相同的,所执行的I/O此次数都是相同的。

适合应用:

因为树状结构的特征,适合于适合与大量的增、删、改(OLTP),因为树状结构节点分裂、合并等很方便;适合高基数的列(唯一值多)的列索引,数据重叠太多,树状就快变为列表了,其查找功能就不能体现了。

反向键索引

存储结构:

反向键索引是一种能够将索引键‘反转’的B*Tree索引。通过把键‘反转’,本来连续的键值变得非常‘离散’。当大量数据并行插入的时候,把本来一个索引块上的连续键值分散到不同的索引块上,减少了索引块的争用。

检索方式:

和普通的B树索引没有差别。

使用场景

因为存储结构同B树索引,使用场合也同B树索引。但是如WHERE?COL1?>?888这样的Index Range Scan不能用反向索引,因为存储结构决定这种本来连续的已经反向的不连续了。

位图索引bitmap

存储结构

类似于java的BitSet采用最简单的方式存储某个值在哪些行出现,哪些行不出现。

如在列性别上建索引。

Value

Row 1

Row 2

Row 3

Row 4

Row 5

Row 6

Row 7

M

1

1

1

1

F

1

1

1

在F行上Row12 row6 row7为1表示这些行的索引列取值是F。搜索一条记录的时候。

**检索方式

当发出where sex=’F’ 这样的SQL语句时,会去搜索F所在的索引条目,然后扫描该索引条目中的bitmap里所有的bit位。第一个bit位为 1,则说明第一条记录上的C1值为01,于是返回第一条记录所在的ROWID(根据该索引条目里记录的start ROWID加上行号得到该记录所在的ROWID)。然后根据ROWID关联其他属性。

适用应用:

适用于基数的列(low?cardinality),因为存储的索引块会比较少。因此不适用创建复合索引,复合索引包含多列,它们的组合一般来说已经是高基数。

适合读操作多,写操作少的,比较适合用在数据仓库系统里,不适合用在OLTP系统。因为与B*树索引(更改操作仅锁定一行)不同的是,如果一个会话更新了位图索引所索引的数据,会把该位图索引条 目指向所有的行都锁定。无法锁定一个位图索引条目中的一位;而是会锁定整个位图索引条目。倘若有其它会话也要更改同样的这个索引条目指向的行,阻塞。而且更改一个记录涉及到把原记录的bitmap对应的bit设置成0,新值所在的bitmap的bit值设置为1,这样两条记录的操作。

位图连接索引

在创建位图连接索引时,它是两个表或多个表之间的索引值的连接,连接的结果存储在索引自身中。通过链接使用B表的列来对A表建立索引。本质上还是位图索引。根据Sales对应的cust_id和Customers上cust_id连接在customers表上建立索引。其实就是在customers表上的以个伪列。

检索方式

询时通过扫描索引(避免两表或多表全表扫描)来获取数据。能够消除查询中的连接操作、因为它实际上已经将连接的结果集保存在索引当中了。

使用要求:

创建位图连接索引时WHERE 子句中的关联条件列必须是主键或唯一约束。

基于函数的索引

存储结构

函索索引计算函数或者表达式的值,并保存到索引中。创建的函数索引可以是B树的,也可以是Bitmap的。

检索方式

当检索语句中包含该函数或者表达式,会使用该函数索引。Inert update等写操作时要更新索引中的函数值。

适用应用:

用这种索引能提前计算并存储复杂的值,因此可以用来加快现有应用的查询速度,而且不用修改应用中的任何逻辑或查询。

索引组织表

存储结构

以B树的方式存储表的数据。索引组织表的数据是根据主键排序后的顺序进行排列的,这样就提高了访问的速度。类似于mysql的innodb存储引擎的主索引。

检索方式

检索方式

定位到主键就定位到了存储位置的数据行。如果直接是根据主键定位则该存储方式也可以理解为一种索引(mssql中聚集索引也是这个意思),如果根据其他列的查询,可以结合在其他列上建立辅助索引(和mysql的Innodb辅助索引是几乎完全相同的思路)

适用应用:

对于总是通过对主键的精确匹配或范围扫描进行访问的表,直接根据范围定位存储位置,就可以获取对应行的数据。因为索引项和数据存储在一起,无论是基于主键的等值查询还是范围查询都能大大节省磁盘访问时间。ROWID伪列是基于主键值的逻辑rowid,而不是物理rowid,即使表被重新组织过,造成了基表行的迁移,二级索引仍然可用,不需要重建。

oracle b树索引原理,Oracle索引原理精简总结相关推荐

  1. oracle 操作树大全,在Oracle中的树形操作

    在Oracle中的树形操作 在Oracle中的树形操作 1.取子节点及路径(正树): select t.id ,t.code, t.name ,t.pid ,SYS_CONNECT_BY_PATH(t ...

  2. Oracle 的原理: 索引

    在表上建立索引,索引对于表,就像目录对于书一样,有了索引可以直接定位到表中的数据位置,大大的加快查找速度.索引可以减少磁盘IO,在逻辑上和物理上都独立于表的数据,索引可以存放在任何磁盘上面,此外Ora ...

  3. Oracle索引详解(索引的原理,创建索引,删除索引,修改索引等)

    Oracle索引详解 一.索引概述 Oracle作为关系型数据库,用户查找数据与行的物理位置无关,表中的每一行均用一个ROWID来标识,当Oracle数据库中存储海量的记录时,就意味着有大量的ROWI ...

  4. 如何理解Mysql的索引及他们的原理--------二叉查找树和平衡二叉树和B树和B+树

    1.索引是什么东西? 索引就是一个数据结构,我们把表中的记录用一个适合高效查找的数据结构来表示,目的就是让查询变得更高效. 2.它到底怎么运作的? 这个问题就说来话长了,且听我慢慢道来: 在mysql ...

  5. 阿里面试:分析为什么B+树更适合作为索引的结构以及索引原理

    mysql的B+树索引 查找使用了二分查找,redis 跳表也使用了二分查找法,kafka查询消息日志也使用了二分查找法,二分查找法时间复杂度O(logn); 在MySQL中,主要有四种类型的索引,分 ...

  6. 索引介绍、索引原理、索引的数据结构(二叉排序树、平衡二叉树、B树、B+树)

    引入 本篇博客偏理论, 将会介绍一下知识: 索引介绍 索引原理 索引的数据结构(二叉树->平衡二叉树->B树->B+树) 聚集索引与辅助索引 MySQL索引管理 创建和删除索引的语法 ...

  7. 从千万级数据查询来聊一聊索引结构和数据库原理

    在日常工作中我们不可避免地会遇到慢SQL问题,比如笔者在之前的公司时会定期收到DBA彪哥发来的Oracle AWR报告,并特别提示我某条sql近阶段执行明显很慢,可能要优化一下等.对于这样的问题通常大 ...

  8. 索引名 oracle,ORACLE 索引名称矫情

    oracle 索引英文名称很多,翻译过来的话也很多中文名称,不过总得来说词不达意.也就是说讲中文的时候,对方无法理解你说的是啥意思,啥情况,啥原理. 比如前缀,非前缀.本地和全局,普通和分区.B树和位 ...

  9. oracle数据库中索值,Oracle数据库中的索引详解

    Oracle数据库中的索引详解以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一 ROWID的概念 存储了row在数据文 ...

最新文章

  1. 使用python建立简单的树机构
  2. c++ 类数组_输入输出流IO体系及常用类关系结构(精要收藏)
  3. 推荐给程序员的书:七月图书推荐
  4. pybind11向C++ dll 传递数组 图像
  5. jvm性能调优实战 - 47超大数据量处理系统是如何OOM的
  6. 在python中是否可以使用if作为变量名_在Python中可以使用if 作为变量名_python使用符号 标示注释...
  7. scala char_Scala中的Char数据类型
  8. LeetCode-316. 去除重复字母(hard且重要)
  9. 如何解析一个字符串并返回一个嵌套数组?
  10. php怎么表示合数,什么是合数 合数的定义
  11. CAS实现单点登录SSO执行原理探究超详细
  12. 测试cpu性能的软件8700,i7-9700和i7-8700性能差距有多大?i7-9700和i7-8700区别对比评测(2)...
  13. 小型超市管理系统【软件工程大作业】
  14. 吐槽国内各大公司的漏洞报告平台
  15. 【将门创投】AI 往期技术分享
  16. docker 容器共享数据_如何在Docker容器之间共享数据
  17. 我们写的程序就像我们的孩子
  18. 【OCM第18期开班】第18期11g OCM培训将于8月23日,晚20点在腾讯课堂开班,第1场考试免费培训!!!...
  19. 代理模式相关简单论述
  20. 计算器四则运算c语言,C语言:基于命令行的四则运算计算器

热门文章

  1. android studio 如何下载指定版本的NDK
  2. 曾鸣:取势、明道、立理、优术
  3. 美多商城项目之用户登录:账号登录、QQ登录
  4. Linux 多种方式实现文件共享
  5. 华为中国大学生ICT大赛2021实践赛网络赛道晋级赛试题解析(答案版)
  6. Saturn简介及重要特性
  7. MIPS汇编语言指令类型
  8. 阿里云视频点播-->>>阿里云媒资上传工具类及配置
  9. 透彻理解位图与矢量图的本质区别(小包子觉得讲的很清晰)
  10. 直接下载docker镜像包