Hash索引
有的数据库存储引擎还支持hash这种数据结构作为其索引,理论上hash索引的索引效率理论上要高于B+树索引
Hash索引的缺点
- 仅仅能满足“=”,“in”,不能使用范围查询
由于hash索引比较的是hash运算之后的hash值,所以只能用于等值的过滤,不能用于基于范围的查询,因为经过相应的hash算法处理之后的hash值的大小关系并不能保证与hash运算前的完全一样,比如上图中的John Smith 和 Sandra Dee都是相同的hash值并不代表他们相同的大小
- 无法被用来避免数据的排序操作
由于hash索引存储的是经过hash运算之后的值,而且hash值的大小关系并不会和hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何的排序运算
- 不能利用部分索引键查询
对于组合索引,hash索引在计算hash值的时候,是将组合索引键合并之后在一起进行运算的hash值,而不是单独计算hash值的,索引通过组合索引的前面一个或者几个索引键进行查询的时候,hash索引也无法被利用,而B=树是支持用组合索引中的部分索引的
- 不能避免表扫描
hash索引是将索引键通过hash运算将运算结果的hash值和所对应的行指针信息存放在一个bucket中的,由于不同的索引键存在相同的hash值,所以即使取出满意那些hash键值的那些数据,也无法从hash索引中直接完成查询,还是要通过访问这个bucket中的实际数据进行相应的比较,所以这个是不能屏蔽表扫描的原因了
- 遇到大量hash值相等的情况后性能并不一定会比B-Tree索引高
BitMap索引(位图索引)
当表中的某个字段只有几种值的时候 ,就比如我们要表示性别(男,女),如果只是在这个字段上进行简单的统计,因此用位图索引是一个很好的选择,不过目前很少的数据库支持位图索引,已知的是Oracle数据库,位图的数据结构类似于B+树,B+树用来定位叶子节点,这些节点包含指定键值的位图段,位图段就位于叶子节点上