在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的 SQL 语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分。
索引分类:
逻辑分类
single column or concatenated 对一列或多列建所引
unique or nonunique 唯一的和非唯一的所引,也就是对某一列或几列的键值( key )是否是唯一的。
Function-based 基于某些函数索引,当执行某些函数时需要对其进行计算,可以将某些函数的计算结果事先保存并加以索引,提高效率。
Doman 索引数据库以外的数据,使用相对较少
物理分类
B-Tree : normal or reverse key B-Tree 索引也是我们传统上常见所理解的索引,它又可以分为正常所引和倒序索引。
Bitmap : 位图所引,后面会细讲
B-Tree 索引
B-Tree index 也是我们传统上常见所理解的索引。 B-tree ( balance tree )即平衡树,左右两个分支相对平衡。
B-Tree index

Root 为根节点, branch 为分支节点, leaf 到最下面一层称为叶子节点。每个节点表示一层,当查找某一数据时先读根节点,再读支节点,最后找到叶子节点。叶子节点会存放 index entry (索引入口),每个索引入口对应一条记录。
Index entry 的组成部分:
Indexentry entry header 存放一些控制信息。
Key column length 某一 key 的长度
Key column value 某一个 key 的值
ROWID 指针,具体指向于某一个数据
创建索引:
conn as1 dex (id ,sex (),name ( i .. dex (i,, SQL dex_idx1 ,object_type DEX
索引分离于表,作为一个单独的个体存在,除了可以根据单个字段创建索引,也可以根据多列创建索引。 Oracle 要求创建索引最多不可超过 32 列。
SQL> create index dex_index2 on dex(sex,name);Index created. SQL> select object_name,object_type from user_objects;OBJECT_NAME OBJECT_TYPE--------------------------------------------------------------------------------DEX TABLEDEX_IDX1 INDEXDEX_INDEX2 INDEX
这里需要理解:
编写一本书,只有章节页面定好之后再设置目录;数据库索引也是一样,只有先插入好数据,再建立索引。那么我们后续对数据库的内容进行插入、删除,索引也需要随之变化。但索引的修改是由 oracle 自动完成的。

上面这张图能更加清晰的描述索引的结构。
跟节点记录 0 至 50 条数据的位置,分支节点进行拆分记录 0 至 10.......42 至 50 ,叶子节点记录每第数据的长度和值,并由指针指向具体的数据。
最后一层的叶子节是双向链接,它们是被有序的链接起来,这样才能快速锁定一个数据范围。
如:
SQL> select * from dex where id>23 and id<32; ID SE NAME---------- -- -------------------- 24 M chongshi 25 M chongshi 26 M chongshi 27 M chongshi 28 M chongshi 29 M chongshi 30 M chongshi 31 M chongshi8 rows selected.
如上面查找的列子,通过索引的方式先找到第 23 条数据,再找到第 32 条数据,这样就能快速的锁定一个查找的范围,如果每条数据都要从根节点开始查找的话,那么效率就会非常低下。
位图索引
位图索引主要针对大量相同值的列而创建。拿全国居民登录一第表来说,假设有四个字段:姓名、性别、年龄、和身份证号,年龄和性别两个字段会产生许多相同的值,性别只有男女两种值,年龄,1 到 120 (假设最大年龄 120 岁)个值。那么不管一张表有几亿条记录,但根据性别字段来区分的话,只有两种取值(男、女)。那么位图索引就是根据字段的这个特性所建立的一种索引。
Bitmap Index

从上图,我们可以看出,一个叶子节点(用不同颜色标识)代表一个key , start rowid 和 end rowid 规定这种类型的检索范围,一个叶子节点标记一个唯一的 bitmap 值。因为一个数值类型对应一个节点,当时行查询时,位图索引通过不同位图取值直接的位运算(与或),来获取到结果集合向量(计算出的结果)。
举例讲解:
假设存在数据表T,有两个数据列A和B,取值如下 ,我们看到 A和B列中存在相同的数据。

对两个数据列A、B分别建立位图索引:idx_t_bita和idx_t_bitb。两个索引对应的存储逻辑结构如下:
Idx_t_bita索引结构,对应的是叶子节点:

Idx_t_bitb索引结构,对应的是叶子节点:

对查询“ select * from t where b=1 and (a=’L’ or a=’M’)”
分析 :位图索引使用方面,和B*索引有很大的不同。B*索引的使用,通常是从根节点开始,经过不断的分支节点比较到最近的符合条件叶子节点。通过叶子节点上的不断Scan操作,“扫描”出结果集合rowid。
而位图索引的工作方式截然不同。通过不同位图取值直接的位运算(与或),来获取到结果集合向量(计算出的结果)。
针对实例 SQL ,可以拆分成如下的操作:
1、a=’L’ or a=’M’
a=L:向量:1010
a=M:向量:0001
or操作的结果,就是两个向量的或操作:结果为1011。
2、结合b=1的向量
中间结果向量:1011
B=1:向量:1001
and操作的结果,1001。翻译过来就是第一和第四行是查询结果。
3、获取到结果rowid
目前知道了起始rowid和终止rowid,以及第一行和第四行为操作结果。可以通过试算的方法获取到结果集合rowid。
位图索引的特点:
1.Bitmap 索引的存储空间节省
2.Bitmap 索引创建的速度快
3.Bitmap 索引允许键值为空
4.Bitmap 索引对表记录的高效访问
创建位图索引:
编辑推荐:
- oracle 索引03-03
- RAC安装【AIX 7 + 11.2.0.4 + ASM】03-03
- 墨天轮最受DBA欢迎的数据库技术文档-SQL优化篇03-03
- Reading and Understanding Systemstate Dumps (Doc ID 423153.1)03-03
- oracle11g: Scheduler Maintenance Tasks or Autotasks (Doc ID 756734.1)03-03
- 19c PDB异常关闭处理与预防03-03
- 【PARAMETER】Oracle参数:MAX_IDLE_BLOCKER_TIME 解释03-03
- 大数据安全与隐私保护03-03
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- oracle 索引
oracle 索引
26-03-03 - 19c PDB异常关闭处理与预防
19c PDB异常关闭处理与预防
26-03-03 - 【PARAMETER】Oracle参数:MAX_IDLE_BLOCKER_TIME 解释
- 【数据库数据恢复】ASM磁盘组掉线的Oracle数据库数据恢复案例
【数据库数据恢复】ASM磁盘组掉线的Oracle数据库数据恢复案例
26-03-03 - Oracle数据库初学者入门教程
Oracle数据库初学者入门教程
26-03-03 - 数据库系统知识总结(一):数据库系统基础知识
数据库系统知识总结(一):数据库系统基础知识
26-03-03 - [20220428]优化的困惑12.txt
[20220428]优化的困惑12.txt
26-03-03 - 福禄克网络电缆测试仪测试Cat 8电缆系统
福禄克网络电缆测试仪测试Cat 8电缆系统
26-03-03 - 虚拟化运维:规划和发展战略性 IT 计划
虚拟化运维:规划和发展战略性 IT 计划
26-03-03 - 如何防范信息系统灾难风险?甲骨文邀你探寻打造业务连续性的秘诀
如何防范信息系统灾难风险?甲骨文邀你探寻打造业务连续性的秘诀
26-03-03
