Oracle的索引主要有三种索引:
- B树索引(B-Tree index)
- 位图索引(Bitmap index)
- 全文索引(Text index)
1. B树索引:Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE INDEX语句时,默认就是在创建b-tree索引。没有特别规定可用于任何情况
1.1 B树索引特点:
- 适合与大量的增、删、改(OLTP)
- 不能用包含OR操作符的查询;
- 适合高基数的列(唯一值多)
- 典型的树状结构;
- 每个结点都是数据块;
- 大多都是物理上一层、两层或三层不定,逻辑上三层;
- 叶子块数据是排序的,从左向右递增;
- 在分支块和根块中放的是索引的范围;
1.2 应用场景:
- OLTP
- 主键或者唯一性性约束
- 键值重复率低的字段比较合适使用B树索引
1.3 索引创建语法:
create [unique | bitmap] index [schema.] 索引名 on [schema.] 表名 (列名1, .., 列名N);
1.4 示例:
1. 创建 '一般索引'('B-Tree' 索引) create index scott.idx_si_sname on scott.student_info(sname); create index scott.idx_si_sname_age on scott.student_info(sname, sex); 2. 创建 '位图索引' create bitmap index scott.bidx_si_sex on scott.student_info(sex);
1.5 B树索引的工作流程
是一种类似平衡二叉树的结构,感觉和mysql的b+树索引很像,叶子结点都是从左到右依次递增
2.位图索引(Bitmap index):适合OLAP场景
我们目前大量使用的索引一般主要是B*Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的,而位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门ID,库房ID等),索引块的一个索引行中存储键值和起止Rowid,以及这些键值的位置编码,位置编码中的每一位表示键值对应的数据行的有无.一个位图索引块可能指向的是几十甚至成百上千行数据的位置.
这种方式存储数据,相对于B*Tree索引,占用的空间非常小,创建和使用非常快.
当根据键值查询时,可以根据起始Rowid和位图状态,快速定位数据.
当根据键值做and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,快速得出结果行数据.
当select count(XX) 时,可以直接访问索引就快速得出统计数据.
2.1 位图索引特点
1.Bitmap索引的存储空间,相对于B*Tree索引,位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少.
bitmap的空间占用主要根以下4个因素相关:
a.表的总记录数
b.索引列的键值多少,列的不同值越少,所需的位图就越少.
2.Bitmap索引创建的速度
位图索引创建时不需要排序,并且按位存储,所需的空间也少.
B*Tree索引则在创建时需要排序,定位等操作,速度要慢得多
3.Bitmap索引允许键值为空
B*Tree索引由于不记录空值,当基于is null的查询时,会使用全表扫描,而对位图索引列进行is null查询时,则可以使用索引.
4.Bitmap索引对表记录的高效访问
当使用count(XX),可以直接访问索引就快速得出统计数据.
当根据位图索引的列进行and,or或 in(x,y,..)查询时,直接用索引的位图进行或运算,在访问数据之前可事先过滤数据
5.Bitmap索引对批量DML操作只需进行一次索引
由于通过位图反映数据情况,批量操作时对索引的更新速度比B*Tree索引一行一行的处理快得多
6.Bitmap索引的锁机制
对于B*Tree索引,insert操作不会锁定其它会话的DML操作.而位图索引,由于用位图反映数据,不同会话更新相同键值的同一位图段,insert、update、delete相互操作都会发锁定,这就是位图所以不适oltp的原因之一(还有一个原因就是位图所以的选择性不强不适做数据查询)。
3.全文索引(这个下次再写。。。)
标签:index,Tree,50,Bitmap,索引,键值,Oracle,scott From: https://www.cnblogs.com/zmc60/p/17020716.html