50.Oracle的索引

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);
3. 删除索引
drop index index_name;

查看索引情况

1.查看表里有哪些索引
select * from user_indexes where table_name = '表名'
或者
select * from all_indexes where table_name = '表名'

2.查看表中索引对应哪些列
select * from user_ind_columns where table_name='表名'        如果查不到可以查dba_xxxx  开头的这些表

 

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.全文索引(这个下次再写。。。)

 

posted on 2023-01-02 22:16  太白金星有点烦  阅读(702)  评论(0编辑  收藏  举报

导航