先说Hash索引

在理想的情况下,key非常分散,不存在Hash碰撞的话,采用Hash索引可以唯一得确定一个key的位置,并且这个位置上就只有一个key,所以查找时间复杂度是O(1),非常快,这是Hash索引的最主要优势。但是呢,Hash索引不是没有缺点,不存在Hash碰撞这是理想情况,通常情况下,同一个Hash值都不只有一个key,也就是说你根据一个key找到了他的hash值位置之后,但是这个位置还有别的key,所以你还得从这个位置找到真正的key,至于怎么找,这个和具体的hash碰撞处理方式有关,最常用的扩展链表法,就是在hash位置上放置链表,此时,就存在一个链表查询的过程,如果hash碰撞比较严重,查询的时间复杂度就远不止O(1),那么hash索引的优势就失去了。其次,Hash索引是不排序的,因此它只适用于等值查询,如果你要查询一定的范围内的数据,那么hash索引是无能为力的,只能把数据挨个查,而不能仅仅是查询到头尾数据之后,从头读到位。并且,hash索引也无法根据索引完成排序,这也是它的不足之一。

再说B+数索引

B+树是一颗严格平衡搜索的树,从根节点到达每一个叶子节点的路径长度都是一样的,并且每个节点可以有多个孩子节点(高扇出),所以可以进可能的把树的高度降到很低。这么做的好处是可以降低读取节点的次数,这就是的B+树非常适合做外部文件索引了。在外部文件索引中,必须要读取到一个节点之后,才能知道它所有的孩子几点的位置,而读取一个节点对应一次IO,所以读取叶子节点的IO数就等于树的高度了,因此树的高度越低,所需要的IO次数就越少。B+树是一颗搜索树,所有的数据都放在叶子节点上,并且这些数据是按顺序排列的。所以在范围查询中,只需要找到范围的上下界节点,就可以得到整个范围内的数据,而且还有一个好处,由于这些数据都是排好序的,所以无需对数据进行再次排序。

总结:

1.Hash索引在不存在hash碰撞的情况下,之需一次读取,查询复杂度为O(1),比B+树快。

2.但是Hash索引是无序的,所以只适用于等值查询,而不能用于范围查询,自然也不具备排序性。根据hash索引查询出来的数据,还有再次进行排序

3.B+树索引的复杂度等于树的高度,一般为3-5次IO。但是B+树叶子节点上的数据是排过序的,因此可以作用于范围查找,而且查询的数据是排过序的,无需再次排序。对于像“SELECT xxx FROM TABLE1 WHERE xxx LIKE 'aaa%'”这样涉及到模糊匹配的查询,本质上也是范围查询。

4.还有一点,数据库中的多列索引中,只能用B+树索引。数据在B+树的哪个结点上,只取决于最左边的列上的key,在结点中在一次按照第二列、第三列排序。所以B+树索引有最左原则的特性。

Hash索引和B+树索引总结的更多相关文章

  1. Hash索引和B树索引

    要知道磁盘结构优化访问的关键在于以block为单位(比如每次读取一个页面) 这两种索引差别也就在聚集到一个block的标准: B树聚集到一个block是因为关键字在一个范围内,关键字在block内的排 ...

  2. SQL优化 MySQL版 - B树索引详讲

    SQL优化 MySQL版  - -B树索引详讲 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太 ...

  3. 搞懂MySQL InnoDB B+树索引

    一.InnoDB索引 InnoDB支持以下几种索引: B+树索引 全文索引 哈希索引 本文将着重介绍B+树索引.其他两个全文索引和哈希索引只是做简单介绍一笔带过. 哈希索引是自适应的,也就是说这个不能 ...

  4. 深入研究B树索引(一)

    摘要:本文对B树索引的结构.内部管理等方面做了一个全面的介绍.同时深入探讨了一些与B树索引有关的广为流传的说法,比如删除记录对索引的影响,定期重建索引能解决许多性能问题等. 1.B树索引的相关概念 索 ...

  5. 基于R树索引的点面关系判断以及效率优化统计

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在之前的博客中,我分别介绍了基于网格的空间索引(http:// ...

  6. MySQL之B+树索引(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)

    每个索引都对应一棵B+树,B+树分为好多层,最下边一层是叶子节点,其余的是内节点.所有用户记录都存储在B+树的叶子节点,所有目录项记录都存储在内节点. InnoDB存储引擎会自动为主键(如果没有它会自 ...

  7. mysql在innodb索引下b+树的高度问题。

    B+树索引介绍 B+树索引的本质是B+树在数据库中的实现.但是B+树索引有一个特点是高扇出性,因此在数据库中,B+树的高度一般在2到3层.也就是说查找某一键值的记录,最多只需要2到3次IO开销.按磁盘 ...

  8. [转帖]B树索引和位图索引的结构介绍

    B树索引和位图索引的结构介绍 http://blog.itpub.net/12679300/viewspace-1174236/ 一  前言:? ROWID:包含键值的行的行ID,(查找块的最快方法, ...

  9. MySQL索引(一)索引基础

    索引是数据库系统里面最重要的概念之一.一句话简单来说,索引的出现其实是为了提高数据查询的效率,就像书的目录一样. 常见模型 索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,这里就介绍三种常 ...

随机推荐

  1. android library使用方法

    一.Android library使用情景 通用模块的重复使用,项目做多了,其实都是差不多,核心模块基本无需大的改动,需要改的只是核心模块上的业务功能而已. Java中可以打包成库,或者说,单纯的ja ...

  2. [bash] 显示配色

    #/bin/bash for STYLE in 0 1 2 3 4 5 6 7; do for FG in 30 31 32 33 34 35 36 37; do for BG in 40 41 42 ...

  3. 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架 - LinFx

    LinFx 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架,遵循领域驱动设计(DDD)规范约束,提供实现事件驱动.事件回溯.响应式等特性的基础设施.让开发者享受到正真意义的面向对象 ...

  4. 如何调用写好的指定模块?——sys.path

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

  5. CentOS6(CentOS7)设置静态IP 并且 能够上网

    链接原文:https://blog.csdn.net/u012453843/article/details/52839105 第一步:在网络连接下有VMnet1和VMnet8两个连接,其中VMnet1 ...

  6. VS2010 UAC执行级别修改

    配置属性 -> 链接器 -> 清单文件 -> UAC执行级别 改为 requireAdministrator 这个级别即可.

  7. javascript中构造器(函数)的__proto__与prototype初探

    背景:最近没什么需求,快要闲出屁了,所以重温了一下js的原型,结果大有收获,且偶然看到Snandy大神的<JavaScript中__proto__与prototype的关系> 这篇文章,感 ...

  8. 简单的IDEA破解到2099年

    原文链接:https://www.cnblogs.com/duende99/p/10038640.html 破解方式有2种,第一种比较方便 第一种比较方便1.使用注册码破解:http://idea.l ...

  9. luogu5212/bzoj2555 substring(后缀自动机+动态树)

    对字符串构建一个后缀自动机. 每次查询的就是在转移边上得到节点的parent树中后缀节点数量. 由于强制在线,可以用动态树维护后缀自动机parent树的子树和. 注意一个玄学的优化:每次在执行连边操作 ...

  10. 【AT2434】JOI 公園 (JOI Park) 最短路+贪心

    题解 我的歪解 我首先想的是分治,我想二分肯定不行,因为它是没有单调性的. 我想了一下感觉它的大部分数据应该是有凸性的(例如\(y=x^2\)的函数图像),所以可以三分. 下面是我的三分代码(骗了不少 ...