B-Tree 索引

本文来自网上整理 来自以下博客内容

http://www.360doc.com/content/13/0712/11/13136648_299364992.shtml;

http://www.cnblogs.com/fnng/archive/2012/10/10/2719221.html;

 B-Tree index 也是我们传统上常见所理解的索引。B-tree (balance tree)即平衡树,左右两个分支相对平衡。

 B树索引在Oracle中是一个通用索引。在创建索引时它就是默认的索引类型。B树索引可以是一个列的(简单)索引,也可以是组合/复合(多个列)的索引。B树索引最多可以包括32列。
树叶块包含了索引值、ROWID,以及指向前一个和后一个树叶块的指针。Oracle可以从两个方向遍历这个二叉树。B树索引保存了在索引列上有值的每个数据行的ROWID值。Oracle不会对索引列上包含NULL值的行进行索引。如果索引是多个列的组合索引,而其中列上包含NULL值,这一行就会处于包含NULL值的索引列中,且将被处理为空(视为NULL)。

Root为根节点,branch 为分支节点,leaf 到最下面一层称为叶子节点。每个节点表示一层,当查找某一数据时先读根节点,再读支节点,最后找到叶子节点。叶子节点会存放index entry (索引入口),每个索引入口对应一条记录。

Index entry 的组成部分:

Indexentry entry  header    存放一些控制信息。

Key column length     某一key的长度

Key column value      某一个key 的值

ROWID    指针,具体指向于某一个数据

例子说明

SQL> create table dex (id int,sex char(1),name char(10));
Table created.
--向表中插入1000条数据
SQL> begin
  for i in 1..1000
  loop
  insert into dex values(i,'M','chongshi');
  end loop;
  commit;
  end;
  /

PL/SQL procedure successfully completed.

查看表记录
SQL> select * from dex;
        ID SE NAME
---------- -- --------------------
       ... . .....
 M  chongshi
 M  chongshi
 M  chongshi
 M  chongshi
 M  chongshi
 M  chongshi
 M  chongshi
 M  chongshi
 M  chongshi
 M  chongshi
 rows selected.
--创建索引:
SQL> create index dex_idx1 on dex(id);
Index created.
注:对表的第一列(id)创建索引。

--查看创建的表与索引
SQL> select object_name,object_type from user_objects;

OBJECT_NAME                  OBJECT_TYPE
--------------------------------------------------------------------------------
DEX                           TABLE
DEX_IDX1                      INDEX

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                                       TABLE
DEX_IDX1                                 INDEX
DEX_INDEX2                               INDEX

上面这张图能更加清晰的描述索引的结构。

跟节点记录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  chongshi

8 rows selected.

如上面查找的列子,通过索引的方式先找到第23条数据,再找到第32条数据,这样就能快速的锁定一个查找的范围,如果每条数据都要从根节点开始查找的话,那么效率就会非常低下。

B-tree 特点
 适合与大量的增、删、改(OLTP)
不能用包含OR操作符的查询;
适合高基数的列(唯一值多)
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围;

posted on 2013-07-17 11:02  无尽的缥缈  阅读(258)  评论(0编辑  收藏  举报