坚持,坚定,坚强

博客园 首页 新随笔 联系 订阅 管理

一. 按存储结构分

    a. b树索引   默认索引

         即二叉搜索树:

               1.所有非叶子结点至多拥有两个儿子(Left和Right)

           2.所有结点存储一个关键字

               3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

               如:

             B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;

            否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入

            右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;

                 如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树

            的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构

             (插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;

               如:

            但B树在经过多次插入与删除后,有可能导致不同的结构:

               右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的

            树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就

            是所谓的“平衡”问题;      

                   实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”;如何保持B树

            结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在B树中插入和删除结点的策略;

    b. 位图索引

        如有表 test(id,name,address)
        数据
            (1,张三,大连)
            (2,李四,天津)
            (3,王五,北京)
            (4,赵六,大连)
            ....

            类似这样的数据,如果查询的时候用到 【where address='大连'】,因为数据库中有很多这样的数据,所以一般的索引起不到查询加速的作用,而建立位图索引后会产生如下位图效果:
            假设有4条数据(就如上所示)

            大连 天津  北京
            1    0     0
            0    1     0
            0    0     1
            1    0     0

            这样当查询:
                select * from 表 where address='大连' or address='北京';
            的时候数据库很快就能根据 同行的 1和0 判断出那一条数据符合要求。
            

            在实际应用中,如果某个字段的值需要频繁更新,那么就不适合在它上面创建位图索引。

            在位图索引中,如果你更新或插入其中一条数值为N的记录,

               那么相应表中数值为N的记录(可能成百上千条)全部被Oracle锁定,

               这就意味着其它用户不能同时更新这些数值为N的记录,其它用户必须要等第一个用户提交后,

               才能获得锁,更新或插入数据,bitmap index它主要用于决策支持系统或静态数据。

 

    c. 反向键索引

        我们知道Oracle会自动为表的主键列建立索引,这个默认的索引是普通的B-Tree索引。对于主键值是按顺序(递增或递减)加入的情况,默认的B- Tree索引并不理想。这是因为如果索引列的值具有严格顺序时,随着数据行的插入,索引树的层级增长很快。搜索索引发生的I/O读写次数和索引树的层级数成正比,也就是说,一棵具有5个层级的B-Tree索引,在最终读取到索引数据时最多可能发生多达5次I/O操作。因而,减少索引的层级数是索引性能调整的一个重要方法。

如果索引列的数据以严格的有序的方式插入,那么B-Tree索引树将变成一棵不对称的"歪树",

而如果索引列的数据以随机值的方式插入,我们将得到一棵趋向对称的索引树,

对称的B-Tree索引

搜索到A块需要进行5次I/O操作,而图 6仅需要3次I/O操作。

既然索引列数据从序列中获取,其有序性无法规避,但在建立索引时,Oracle允许对索引列的值进行反向,即预先对列值进行比特位的反向,如 1000,10001,10011,10111,1100经过反向后的值将是0001,1001,1101,0011。显然经过位反向处理的有序数据变得比较随机了,这样所得到的索引树就比较对称,从而提高表的查询性能。

但反向键索引也有它局限性:如果在WHERE语句中,需要对索引列的值进行范围性的搜索,如BETWEEN、<、>等,其反向键索引无法使用,此时,Oracle将执行全表扫描;只有对反向键索引列进行 <> 和 = 的比较操作时,其反向键索引才会得到使用。

 

二. 按索引值分

    a. 唯一索引

        列上的值是唯一的,主键为唯一索引

    b. 非唯一索引

        在列上的值可以为null

三. 其它索引

    a. 单列索引

        一个列建索引

    b. 组合索引

        多个列一起建索引

    c. 基于函数索引

         使用函数里面的表达式来索引

 

  能用唯一索引,一定用唯一索引

  能加非空,就加非空约束

  一定要统计表的信息,索引的信息,柱状图的信息。

  联合索引的顺序不同,影响索引的选择,尽量将值少的放在前面

  只有做到以上四点,数据库才会正确的选择执行计划。

 

四: 创建语法

    create unique|bitmap index 索引名称

    on 表名

    (列1 asc|desc ,列2.。。。)

    reverse

    reverse 为反向键索引,unique唯一和bitmap位置不写为b树索引


 

posted on 2011-06-23 14:51  老公鸡  阅读(240)  评论(0编辑  收藏  举报