zoukankan      html  css  js  c++  java
  • oralce 索引(2)

    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操作符的查询;
    适合高基数的列(唯一值多)
    典型的树状结构;
    每个结点都是数据块;
    大多都是物理上一层、两层或三层不定,逻辑上三层;
    叶子块数据是排序的,从左向右递增;
    在分支块和根块中放的是索引的范围;

  • 相关阅读:
    openstack newton 版本 horizon二次开发
    ubuntu 远程root登录
    记录一次用户态踩内存问题
    (leetcode)二叉树的前序遍历-c语言实现
    通过blacklist来禁用驱动
    最小栈问题
    判断是否为环形链表
    按照层次序列创建二叉树,并判断二叉树是否为二叉搜索树
    操作系统交付时需要做哪些安全检查项
    RDMA相关的技术网站
  • 原文地址:https://www.cnblogs.com/wujin/p/3195339.html
Copyright © 2011-2022 走看看