关于对【oracle索引】的理解与简述

news2024/11/23 22:39:01

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/131094864
出自【进步*于辰的博客】

无论使用的是oraclemysql,亦或者其他数据库,几乎所有企业级项目都会使用索引,因为这能大大提升程序性能。
oracle索引如何实现性能优化?这就是本文阐述的核心。
参考笔记一,P25.27、P26.28、P30.2;笔记二,P70/71。

注:“索引值”指索引原子(即B+树中的一个节点);“索引列值”指记录/数据

文章目录

  • 1、概述
    • 1.1 创建
    • 1.2 查询
    • 1.3 适用场景
    • 1.4 不适用场景
    • 1.5 补充说明
  • 2、关于索引构建过程(性能优化原理)
    • 2.1 构建过程
    • 2.2 补充说明
    • 2.3 索引结构细节
  • 3、关于索引分类
    • 3.1 唯一索引
    • 3.2 组合索引
    • 3.3 反向键索引
    • 3.4 位图索引
    • 3.5 基于函数的索引
  • 4、最后

1、概述

下图红框处是数据表的rowid
在这里插入图片描述
其是每行记录的唯一标识

从宏观上说,索引是排序后rowid,其排序不是指升序或降序,而是将rowid按照一定的数据结构进行排列。
先说结论:
rowid本身无任何优化查询的功能,索引可以实现优化依赖于数据结构

1.1 创建

  1. 方式1:当添加主键唯一键时,会自动生成索引;
  2. 方式2:create index 索引名 on 表名(字段名)

1.2 查询

  1. user_indexes:查询用户所有索引;
  2. user_ind_columns:查询用户所有索引对应的字段。

1.3 适用场景

  1. 数据量大;
  2. 结果集所包含记录量占数据表记录量的2% ~ 4%左右;
  3. 经常用作条件多表连接的字段;
  4. 所查询字段的记录范围很广;
  5. 所查询字段包含大量 null,因为索引不包含 null

1.4 不适用场景

  1. 数据量小;
  2. 不常作为条件的字段;
  3. 频繁更新的字段;
  4. 索引字段是条件的一部分时。如:where emp.salary * 2 > 10000,此时索引无效;(原因后续说明)
  5. 条件中包含单行函数时。如:where round(salary) > 10000。(除“基于函数的索引”外,见下文)

1.5 补充说明

  1. 优点:优化查询速度。
  2. 不足:占用内存;索引数量多时难以维护;降低 DML 时性能。
  3. 适用场景:当数据量大、不经常进行 DML 且访问频率高时。(对上述阐述的总结)
  4. 一般情况下,先添加索引,后新增记录;(原因后续说明)
  5. 当条件中包含likeinnot in等范围查询时,索引失效。(下文说明)

2、关于索引构建过程(性能优化原理)

启发源自博文【Oracle索引结构】(转发)。

2.1 构建过程

注:
1、下文阐述中,id为数据表其中一个字段,非主键(上文阐述:“在创建主键或唯一键时,会自动创建索引”,这种索引称之为主键索引,即索引建立在主键字段上。实际上,可以在任何某个或某多个字段上建立索引,并且索引有多种,看下文);
2、上文阐述:“索引所实现的性能优化依赖于所使用的数据结构”。无论是oraclemysql,索引的数据结构都包括B+树hashtable这2种。下述以B+树这种数据结构作为阐述示例,B+树也是索引所使用的主要数据结构之一。

借用那篇博文中的2张图,便于大家理解。
在这里插入图片描述

  1. rowidid取出,以类似entry的结构组成一个,即一条记录对应一个。然后几个组成一块(叶节点);
    注:这个即索引值,不过其不是entry,下文简述索引细节。这里说的entry,就是Map.Entry
  2. 几个块由某个块(茎节点)管理,此节点记录着所管理的多个块的信息,即索引
  3. 。。。以此类推。。。
  4. 由某个节点(根节点)管理所有的茎节点

总结:
这种“B+树型索引,所有的记录都存放在“叶节点”中,而“茎节点”和“根节点”存放的都是所管理节点的信息,包括“索引列值”和rowid,即索引,也称之为“索引值”(见序言)

2.2 补充说明

  1. B+树高度较低。如:在一个有几百亿条记录的数据表上建立索引,“树”高度不过 20 余层;
  2. 数据库最小单位是,最小分配单位是存放一个段至少需要一个区;(最后这点我目前也不明其意)
  3. 索引查找不一定比全表扫描(无索引)效率高的原因:
    全表扫描一次可读多个块,而索引查找一次只能读一个。而索引查找的记录可能分散分布于多个块,即索引查找的读取次数可能较多于全局扫描。上文中第1.5项的第5点就是这种情况,因此致使索引失效;
    注:索引采用B+树,这种结构可大大加快检索速度,不过,若是上面这种情况,索引查找就需要多次通过IO读取各个块,自然效率大打折扣。有很多种方法可应对这种情况,其中之一是“优化B+树”。因为B+树是没有“闭环”的(所谓“闭环”,即单分支,没有回路)。“优化B+树”的大致实现就是将所有“叶节点”相连,构成链表,即形成回路,从而减少读取IO流的次数。(关于“优化B+树”,后续详述)
  4. 索引的数据结构是B+树,本身有序。

2.3 索引结构细节

大家看另1张图。
在这里插入图片描述

可见,索引值由Index entry headerKey column lengthKey column value(列值,即上文中的“索引列值”)、ROWID组成。

3、关于索引分类

3.1 唯一索引

主键或唯一键创建时自动生成;
手动创建:create unique index 索引名 on 表名(字段名)

3.2 组合索引

当创建索引时,指定多列,就是组合索引。其中,根据上文【构建过程】,可知组合索引的每一个索引列值都包含组合列的各个数据
注意: 只有当条件(where)中包含此组合所有或大部分字段时,索引才能生效(后续详述)。

3.3 反向键索引

反转索引列值的每个字节,从而实现索引值的均匀分配避免B+树不平衡。(注:“不平衡”是指某个/某些分支较其他同高度分支较长,致使分支“倾斜”的情况)
常用宇连续增长、且索引列值前段相同的字段。如:索引列值为100110021003,经反向键索引转化后变为100120013001
手动创建:create index 索引名 on 表名(字段名) reverse

3.4 位图索引

适合创建于“低基数”的字段,如:性别国家编号。(注:“低基数”指取值固定取值范围很小、且不经常更新
上文阐述:“索引值由索引列值(记录/数据)和rowid组成”,而位图索引不是。
位图索引不直接存储rowid,而是存储字节位rowid映射,目的是减少空间占用
因此,位图索引适用于数据仓库,不适用于OLTP(关于OLTP,后续说明)。
手动创建:create bitmap index 索引名 on 表名(字段名)

3.5 基于函数的索引

指基于1/n个字段上的函数表达式创建的索引。简言之,在创建此类索引时,使用了表达式或函数
限制: 表达式中不能使用聚合函数(如:count、max、sum),比较常用的是单行函数;字段类型不能是lob(clob、blob);且当前用户必须拥有query rewrite权限。
示例:
需求:查询用户名,用“基于函数的索引”进行优化。
语句:... where upper(user_name) = ‘xx’ ...
手动创建:create index 索引名 on 表名(upper(字段名))

4、最后

本文是“纯阐述”,可谓是0示例,这样难免缺乏可信性可行性。因此,本文的目的是为了让大家对oracle索引所实现的性能优化原理、以及分类有一个大致的了解。

本文完结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何吃透一个Java项目?

现在Austin的文档我觉得还是比较全的,但到了看代码的时候,可能有的同学就不知道应该怎么看,有想知道模块之间的调用链路,有想一点一点把细节给全看了。这时候就很可能在项目里犯迷糊了,绕不出不来了。 Java开源项目消息…

MySQL的下载安装以及环境配置---图文教程

目录 一.下载 二.安装 三.设置环境变量 四.MySQL数据库的使用及注意事项 SQL语句注意事项 一.下载 1.打开 MySQL 数据库的网站。 2.往下滑 3.进入新的页面之后,点击 MySQL Installer for Windows 4.进入新的页面时,就可以下载MySQL数据库了&#x…

数据结构05:树的定义与双亲、孩子表示法[更新中]

参考用书:王道考研《2024年 数据结构考研复习指导》 参考用书配套视频:5.1.1 树的定义和基本术语_哔哩哔哩_bilibili 特别感谢: Chat GPT老师[部分名词解释、修改BUG]、BING老师[封面图]~ 备注:博文目前是未完成的状态&#xff…

Web安全:拿到 Web 服务器 最高权限.(vulntarget 靶场 A)

Web安全:拿到 Web 服务器 最高权限. Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,也可以放置网站文件,让全世界浏览;可以放置数据…

43 最佳实践-性能最佳实践-IOThread配置

文章目录 43 最佳实践-性能最佳实践-IOThread配置43.1 概述43.2 配置说明 43 最佳实践-性能最佳实践-IOThread配置 43.1 概述 KVM平台上,对虚拟磁盘的读写在后端默认由QEMU主线程负责处理。这样会造成如下问题: 虚拟机的I/O请求都由一个QEMU主线程进行…

基于springboot的数码论坛系统设计(Java、MySQL、B/S)

wx供重浩:创享日记 对话框发送:数码论坛 获取源码源文件论文报告PPT 网络的广泛应用给生活带来了十分的便利。所以把数码论坛与现在网络相结合,利用java技术建设数码论坛系统,实现数码论坛的信息化。则对于进一步提高数码论坛发展…

Linux 下pause函数是如何实现的?

当你在程序中调用 pause() 函数时,它会使得你的程序停止执行,直到有一个信号被捕获。这是通过系统调用实现的。系统调用会使得程序从用户模式切换到内核模式。 这里是 pause() 函数的基本工作原理: 当你的程序调用 pause() 函数时&#xff…

python基础知识(十):类

目录 1. 类和方法的概念2. 类的定义3. 类的继承4. 重写父类的方法 1. 类和方法的概念 类:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。举个例子,狗类就是狗的集合,每条狗都是狗…

kali学习笔记(二)

一、关闭自动锁屏 关闭自动锁屏对于测试人员来说,可以按照自己的习惯来设置,不然kali会过十分钟就锁屏,有的时候会比较不方便。 1、使用root账号登录,在display设置选项中做如下设置。 2、把休眠选项关掉。 二、创建快照 关机创…

透视Linux内核,BPF 深度分析与案例讲解

本次主要对BPF的部分原理、应用案例上进行一次分析记录。 BPF介绍 当内核触发事件时,BPF虚拟机能够运行相应的BPF程序指令,但是并不是意味着BPF程序能访问内核触发的所有事件。将BPF目标文件加载到BPF虚拟机时,需要确定特定的程序类型&…

SpringBoot中的定时任务@Scheduled的使用

1.Scheduled注解介绍 在spring boot的项目中需要使用到定时任务的时候,可以使用Scheduled注解,这只是在一个JVM进程中很适用,如果涉及到服务器是集群的情况下,建议使用任务调度平台。这样任务调度平台会在多台服务器中选择一台进…

【linux】在Ubuntu下部署nginx——nginx的安装与卸载

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

Think PHP6+Swagger3

swagger是一个解决接口规范化、标准化、文档化的一个组件,既可以直接自动生成resutful接口文档又能进行功能测试的一个web服务。本文是think PHP6结合swagger3的一个记录过程。 composer安装ThinkPHP 一般安装最新稳定版本,不一定是最新版本 composer…

怎么通过Fiddler对APP进行抓包?以及高级应用场景分析

目录 前言 简单说下Fiddler的抓包原理: 使用fiddler代理远程捕获APP请求 Fiddler高级应用场景介绍 1、url地址重写 fiddler抓包详细教程:全网抓包天花板教程,B站讲的最详细的Fiddler/Charles抓包教学视频。2小时包你学会_哔哩哔哩_bilibi…

软件测试之路已不再是坦途

去年下半年才跳了槽,过程非常顺利,没有经历大家所说的工作荒的境地,所以一直没有直观地感受到软件测试就业形势到底有多严峻。 近来看到一些机构频频发出某某测试员在糟糕的就业形势下逆袭拿下XXW的某厂offer,然后推荐测试进阶课…

Django学习笔记-配置Docker、Git环境与项目创建

笔记内容转载自AcWing的Django框架课讲义,课程链接:AcWing Django框架课。 CONTENTS 1. 配置Docker环境2. Django项目创建3. Django App创建 1. 配置Docker环境 首先拉取一个 Ubuntu 镜像: docker pull ubuntu:20.04创建容器后进入容器配置…

Splunk:构建安全监控解决方案(第 1 部分)

在我的网络安全训练营的最后几周,我们的最终项目之一是使用 Splunk Enterprise 为一个名为 VSI(虚拟空间工业)的虚构组织构建安全监控环境,对于那些可能不知道的人来说,它是一个 SIEM(安全信息和事件管理器…

科一容易忘、容易混的点——图类

注意行人 和 人行横道区别 注意行人:黄色,里面是什么就注意什么 人行横道:正方形 “不得” xxx 的 就选择 【正确】 点火开关 1、LOCK档:这是一个锁止档,功能是当除了防盗系统和车内小灯以外,电路是完全关…

【Redis应用】用户签到统计连续签到(三)

🚗Redis应用学习第三站~ 🚩本文已收录至专栏:Redis技术学习 签到功能是我们非常常见的一个功能,几乎在每个app中都能碰到,让我们一起看看如何实现吧~ 一.BitMap用法引入 我们针对签到功能完全可以通过mysql来完成&am…

Python基于指定范围筛选并剔除Excel表格中的数据

本文介绍基于Python语言,读取Excel表格文件,基于我们给定的规则,对其中的数据加以筛选,将不在指定数据范围内的数据剔除,保留符合我们需要的数据的方法。 首先,我们来明确一下本文的具体需求。现有一个Exce…