数据库B树索引和hash索引的优缺点比较

  我又来了,接着上一篇的一个疑问,B树索引和hash索引的区别到底是什么?带着这样的疑问,我找到了一个总结的比较全面的一个博文:http://blog.sina.com.cn/s/blog_b92fcb510102vvdt.html ,emmmmm这篇文章呢,总结的是比较好的,但是没有介绍底层的数据结构区别,可能导致没有学习好数据结构的同学比较难以理解,需要记住这些区别,不能靠背诵课文一样一条一条一条背,要从底层的数据结构上面去理解,为啥hash等值查询比较快,不适用于范围查询,你知道hash是什么样的结构,你会觉得这样的结论理所当然,反之就是一头雾水。终于明白学校上的数据结构这种看起来没有什么明面上的好处的课程,是什么原因了。有的东西就是其实很简单,你觉得看一下这不懂那里不懂,就觉得太难放弃了,其实就是差一点耐心。咳咳,差点扯远了。
  数据结构emmmm我搁这一两句也讲不清楚,贴一个博文比较清晰简明的讲了一下数据结构的基础知识 http://blog.csdn.net/wl044090432/article/details/53423333 温习一下,然后再来看看B树和hash的区别。
  B树索引意味着记录是按照索引的值进行顺序排列的,并且每一个叶子页到根的距离相同。B-Tree索引适用于全键值、键值范围或者键前缀查找。以索引key(a,b,c)为例。

  • 全值匹配​:可以查找a=1 and b=1 and c=1
  • 匹配最最前缀:可以查找a=1
  • 匹配列前缀:可以查找a like ‘a%’​​
  • 匹配范围值:可以查找 a>1 and​ a<10

      全值匹配,那么abc三个索引组合的值就能确定,可以在B树上就找出满足这三个条件的记录主键(为什么是记录主键而不是记录的值或者位置,可以看上一篇文章,聚集索引时通往真实数据的唯一途径);组合索引的特点就是先在索引树中匹配前面的一个字段,所以匹配最前缀也是可以通过这个索引树加速查找的,如果 查找b=1,因为a的值不能确定,所以没办法索引(大致就是总是要先排序前面的字段值,具体以后等看一下数据库聚合索引到底是如何排序构建B树再来深刻理解一下,现在手上没有趁手的资料);字符串的排序方式就是从第一个字符开始比较,所以匹配字符前缀也是可以在树上面进行搜索的;B树是按照索引值进行排序的数据结构,所以可以进行范围查找,这一点是和hash索引最明显的区别。
      hash索引是基于hash表实现的,hash的特点就是键值对进行映射,同一个值计算出来的hash值肯定是相同的,但是不能保证相邻的两个值映射到相邻的位置上(数据结构hash函数与映射)。所以hash索引的最大的特点就是等值查询快,不能进行范围索引。

  • hash存储的是哈希值和指针,不存储字段值

  • 不是按照索引顺序存储,不能用于排序
  • 不支持部分索引列匹配查找
  • 支持等值查询,不支持范围查询
  • 哈希值冲突多时,不适用

      哈希索引的是用字段的值,计算出一个范围内的hash值,通过hash值去映射得到数据的位置(行号还是实际数据的位置,还没有区分)已经指向下一个数据的指针,不会存储字段的值,所以使用hash索引不能直接得到数据,只能得到一个位置信息;hash函数计算hash值和映射的一些算法,导致hash是无序的,不能用于排序,以及范围查询,只适用于等值查询;组合索引时,是使用组合的字段值共同计算出一个hash值,只能确定部分的字段值,我们无法预测hash值的特征,也就没办法在hash表上面进行搜索,所以不支持部分索引列匹配查找;hash函数的选择对hash结构的性能有很大的影响,好的hash函数要让数据的hash值有一个较均匀的分布,举一个极端的例子,如果100个数据,计算出了同一个hash值,那么意味着存储这些数据的时候,要一直使用解决冲突的算法去存储,然后对查询没有任何好处,不仅仅浪费了hash冲突的计算时间,对查询还没有任何优化,所以在哈希冲突多时,反而不适用,但是不得不承认,在hash没有太多的冲突时,等值查询的速度确实是比较可观的。
      emmmmmm,讲的不是很清楚,类似一些写给自己的总结。

没有更多推荐了,返回首页