索引在数据结构上可以分为三种B树索引、位图索引和散列索引
B树索引
结构:
特点:
1.索引不存储null值。
更准确的说,单列索引不存储null值,复合索引不存储全为null的值
索引不能存储Null,所以对这列采用is null条件时,因为索引上根本没Null值,不能利用到索引,只
能全表扫描。
为什么索引列不能存Null值呢?将索引列值进行建树,其中必然涉及到诸多的比较操作。Null值
的特殊性就在于参与的运算大多取值为null。这样的话,null值实际上是不能参与进建索引的
过程。也就是说,null值不会像其他取值一样出现在索引树的叶子节点上。
B树索引测试1:NULL是否存在索引上。
create table btree_test(id number,code varchar2(10));
create index idx_btree_test_id on btree_test(id,code);
select object_id from user_objects where object_name='IDX_BTREE_TEST_ID';
alter session set events 'immediate trace name treedump level 59097';
insert into btree_test values(null,null);
alter session set events 'immediate trace name treedump level 59097';
insert into btree_test values(null,'1');
alter session set events 'immediate trace name treedump level 59097';
insert into btree_test values(1,null);
alter session set events 'immediate trace name treedump level 59097';
然后查看转储文件,admin\数据库名\udump
发现这样的信息:
*** 2013-07-19 14:56:41.827
----- begin tree dump
leaf: 0x140142c 20976684 (0: nrow: 0 rrow: 0)
----- end tree dump
*** 2013-07-19 14:56:54.480
----- begin tree dump
leaf: 0x140142c 20976684 (0: nrow: 1 rrow: 1)
----- end tree dump
*** 2013-07-19 14:57:08.139
----- begin tree dump
leaf: 0x140142c 20976684 (0: nrow: 2 rrow: 2)
----- end tree dump
nrow当前节点所含索引条目的数量(包括delete的条目)
rrow有效的索引条目的数量
可以发现:
插入null,null时,有效的索引条目为0
插入null,1时, 有效的索引条目为1
插入1,null时, 有效的索引条目为2
所以,复合索引只有当要插入的值全为Null时才不能放入存入索引中。
也可以这样看:
SELECT num_rows FROM user_indexes t WHERE t.index_name ='btree_test';
2.不适合键值较少的列(重复数据较多的列)。
假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。
再加上访问索引块,一共要访问大于200个的数据块。
如果全表扫描,假设10条数据一个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块
少一些,肯定就不会利用索引了。
3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')
假如有这样一列code的值为'AAA','AAB','BAA','BAB' ,如果where code like '%AB'条件,由于前面是
模糊的,所以不能利用索引的顺序,必须一个个去找,看是否满足条件。这样会导致全索引扫描或者全表扫
描。如果是这样的条件where code like 'A % ',就可以查找CODE中A开头的CODE的位置,当碰到B开头的
数据时,就可以停止查找了,因为后面的数据一定不满足要求。这样就可以利用索引了。
位图索引
就是用位图表示的索引,对列的每个键值建立一个位图。
如test表中有state这样一列,数据如下:
10 20 30 20 10 30 10 30 20 30
那么会建立三个位图,如下:
BLOCK1 KEY=10 1 0 0 0 1 0 1 0 0 0
BLOCK2 KEY=20 1 0 0 0 1 0 1 0 0 0
BLOCK3 KEY=30 1 0 0 0 1 0 1 0 0 0
位图索引特点:
1.相对于B*Tree索引,占用的空间非常小,创建和使用非常快。
位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少。
2.不适合键值较多的列。
3.不适合update、insert、delete频繁的列。
4.可以存储null值。
B*Tree索引由于不记录空值,当基于is null的查询时,会使用全表扫描,而对位图索引列进
行is null查询时,则可以使用索引。
5.当select count(XX) 时,可以直接访问索引中一个位图就快速得出统计数据。
6.当根据键值做and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,快速得出结果行数
据。
散列索引
散列索引是根据HASH算法来构建的索引,所以检索速度很快,但不能范围查询。
散列索引的特点
1.只适合等值查询(包括= <> 和in),不适合模糊或范围查询
相关推荐
位图索引在处理“IN”或“NOT IN”类型的查询时非常高效,但在大量数据和频繁更新的情况下,位图索引的维护成本较高。 最后,我们探讨“多维空间索引”。在处理地理信息或者图像数据时,需要考虑多维空间索引。常见...
这篇文章将介绍数据库索引技术的基础知识,包括索引技术综述、B+树索引、散列索引、位图索引和多维空间索引等。 5.1 索引技术基础 索引是一种特殊类型的记录文件,能够帮助我们快速地检索到满足指定条件的记录。...
索引可以是B+树索引、簇索引、散列簇索引、反序索引、位图索引和函数索引等多种类型。 B+树索引是Oracle中最常用的索引类型。它的特点是所有叶节点都具有相同的深度,因此无论何种类型的查询都可以确保快速的查询...
网格索引结构 (类散列结构) kd树 (类树结构) 四叉树 (类树结构) R树 (类树结构)
此外,还有其他类型的索引如位图索引、散列索引等,但B树索引因其高效性而被广泛使用。 #### 二、索引结构与存储 1. **块(Block)**:这是数据库中最基本的存储单元,Oracle数据库中的每个块都有固定的大小,这个...
索引的类型多种多样,包括非唯一索引、唯一索引、位图索引以及各种分区索引(如局部有前缀、无前缀、全局有前缀分区索引和散列分区索引)。其中,非唯一索引是最常见的,而位图索引适用于基数较小的列,可以有效地...
位图索引也是如此,仅仅只是是叶子节点不同B*数索引; 索引由根节点、分支节点和叶子节点组成。上级索引块包括下级索引块的索引数据,叶节点包括索引数据和确定行实际位置的rowid。 使用索引的目的: 加快查询速度 ...
Oracle提供了多种索引类型,包括B树索引、位图索引、散列索引等,每种索引都有其适用场景。在选择创建哪种类型的索引时,应考虑以下因素: - **数据分布**:对于数据分布均匀的列,B树索引通常是最佳选择。 - **...
Oracle使用B*树(B星树)作为其主要的索引数据结构,无论是非唯一索引还是唯一索引,其基本组成包括根节点、分支节点和叶子节点。叶子节点包含索引数据以及指向表中实际行位置的rowid。 索引的类型多样,包括: 1. ...
- **位图索引**:适合于包含大量重复值的列,尤其是在进行大量选择操作时非常有效。 - **散列索引**:适用于简单的等值查询。 - **全局索引分区**:与分区表关联的索引,支持跨分区的查询。 - **局部索引分区**:仅...
常见的索引类型包括B树索引、位图索引和散列索引。B树索引适用于范围查询和排序,位图索引适合在低基数(非唯一值少)的列上,而散列索引则适用于等值查询。簇集是一种特殊的存储方式,它将相关的数据物理地放在一起...
索引是提高数据库查询效率的关键技术之一,本节将深入探讨几种常见的索引实现方式:B+树索引、散列索引以及位图索引。 ##### B+树索引 **概念及特性:** B+树是一种自平衡的树数据结构,广泛应用于数据库系统中...
5. **常见索引类型**:包括顺序文件上的索引、B+树索引、散列索引和位图索引。B+树索引适用于大数据量的查找,具备动态平衡的优点;散列索引查找速度快,适合等值查询;位图索引适用于低基数(值种类少)的列。 6. ...
**索引结构**:Oracle中的索引通常使用B*树数据结构实现,对于位图索引,虽然其内部结构略有不同,但仍基于B*树。这种结构由根节点、分支节点以及叶子节点组成。其中,根节点指向各个分支节点,分支节点再指向叶子...
- Hash索引利用散列函数和Hash桶来组织数据,其优点在于高效且最适合等值比较/点查询操作。 - Hash索引不支持范围查询和部分索引列的使用,在唯一列(unique columns)上使用时可能会遇到Hash冲突的问题。 三、WAL...
辅助索引则用于非唯一字段,如多重索引、位图索引等,它们可以加速对多个字段的查询。 **五、B树与B+树** B树和B+树都是平衡多路搜索树,用于索引。B树每个节点可以有多个子节点,数据存储在节点内,而B+树所有数据...
在Oracle中,分区索引可以是直方图索引、位图索引或B树索引。直方图索引适用于分布均匀的数据,通过统计每个索引键的频率来优化查询。位图索引适合低基数(即唯一值较少)的列,它将每个索引值用一个位来表示,节省...
例如,B树、位图索引和倒排索引都是常见的索引类型,它们各自适应不同的查询场景。 5. **数据结构的应用**: 数据结构广泛应用于操作系统、数据库、编译器、图形学、人工智能等多个领域。比如,在网页搜索引擎中,...
Oracle中的索引主要基于B*树数据结构,位图索引也是基于B*树,但叶子节点有所不同。 2. **使用索引的目的**:主要目的是加速查询、减少I/O操作和避免磁盘排序。对于返回记录数超过40%的排序表和超过7%的非排序表,...