导读

在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议。

二者区别

备注:先说下, 在MySQL文档里,实际上是把B+树索引写成了BTREE ,例如像下面这样的写法:

CREATE TABLE t(

aid int unsigned not null auto_increment,

userid int unsigned not null default 0,

username varchar(20) not null default ‘’,

detail varchar(255) not null default ‘’,

primary key(aid),

unique key(uid) USING BTREE ,

key (username(12)) USING BTREE — 此处 uname 列只创建了最左12个字符长度的部分索引

)engine=InnoDB;

一个经典的 B+树索引数据结构 见下图:

B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。

在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。

因此,B+树索引被广泛应用于数据库、文件系统等场景。顺便说一下,xfs文件系统比ext3/ext4效率高很多的原因之一就是,它的文件及目录索引结构全部采用B+树索引,而ext3/ext4的文件目录结构则采用Linked list, hashed B-tree、Extents/Bitmap等索引数据结构,因此在高I/O压力下,其IOPS能力不如xfs。

详细可参见:

https://en.wikipedia.org/wiki/Ext4https://en.wikipedia.org/wiki/XFS

而 哈希索引的示意图 则是这样的:

简单地说, 哈希索引就是采用一定的哈希算法 ,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。

从上面的图来看,B+树索引和哈希索引的明显区别是:

  • 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;

  • 从示意图中也能看到, 如果是范围查询检索,这时候哈希索引就毫无用武之地了 ,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;

  • 同理, 哈希索引也没办法利用索引完成排序 ,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);

  • 哈希索引也不支持多列联合索引的最左匹配规则;

  • B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大, 在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题 。

后记

在MySQL中,只有HEAP/MEMORY引擎表才能显式支持哈希索引(NDB也支持,但这个不常用),InnoDB引擎的自适应哈希索引(adaptive hash index)不在此列,因为这不是创建索引时可指定的。

还需要注意到:HEAP/MEMORY引擎表在mysql实例重启后,数据会丢失。

通常,B+树索引结构适用于绝大多数场景,像下面这种场景用哈希索引才更有优势:

在HEAP表中,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引

例如这种SQL:SELECT … FROM t WHERE C1 = ?; — 仅等值查询

在大多数场景下,都会有范围查询、排序、分组等查询特征,用B+树索引就可以了。

数据库:B+树索引和Hash索引得区别相关推荐

  1. mysql索引b树和hash_B树索引和Hash索引的应用场景和区别(转载)

    转自:https://blog.csdn.net/chuangsun/article/details/78013537 关系型数据库中,索引大多采用B/B+树来作为存储结构,而全文搜索引擎的索引则主要 ...

  2. MySQL中B-tree索引和Hash索引区别

    在MySQL文档里,实际上是把B+树索引写成了BTREE,例如像下面这样的写法: CREATE TABLE t(aid int unsigned not null auto_increment,use ...

  3. mysql btree检索策略_MySQL之Btree索引和HASH索引的区别以及索引优化策略

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  4. mysql index fulltext btree_MySQL btree索引与hash索引区别

    在mysql中,大多数索引(如 primary key,unique,index和fulltext)都是在btree中存储,但使用memory引擎可以选择btree索引或者hash索引,两种不同类型的 ...

  5. MySQL的btree索引和hash索引的区别

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...

  6. MySQL-Btree索引和Hash索引初探

    文章目录 生猛干货 官方文档 MySQL支持的索引类型 B树索引 B树索引的特点 什么情况下会使用到B树索引 Btree索引的使用限制 hash索引 hash索引的特点 hash索引的限制 为啥要使用 ...

  7. hash 值重复_MySQL调优实战:MySQL B+Tree索引和Hash索引的区别?

    点击上方"Java分享吧",选择"设为星标" 优选有价值的技术文献,从我做起 MySQL技术篇章 1.B+Tree索引 1.B+Tree首先是有序结构,为了不至 ...

  8. MySQL索引类型 btree索引和hash索引的区别

    来源一 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 ...

  9. java实践7索引之Hash索引、位图索引、倒排索引原理

    文章目录 java实践7索引之Hash索引.位图索引.倒排索引原理 Hash索引 优缺点: 位图索引: 优缺点: 倒排索引: B树+倒排索引 java实践7索引之Hash索引.位图索引.倒排索引原理 ...

  10. mysql hash索引 btree索引_B-Tree索引与Hash索引的比较

    B-Tree索引与Hash索引的比较 理解B-Tree和Hash的数据结构能够帮助我们预测不同存储引擎下的查询性能差异.存储引擎在索引中使用这些数据结构,尤其是MEMORY 同时提供了B-Tree和H ...

最新文章

  1. 用链表c语言程序设计,C语言程序设计-基于链表的学生成绩管理系统
  2. android c# websocket
  3. android 自定义apk名,Android Studio多渠道打包、自定义打包APK名称
  4. 神奇的互换身体术--java的类型擦除
  5. 深度学习之基于opencv和CNN实现人脸识别
  6. which oracle linux,(总结)Linux下Oracle11gR2的ORA-00845错误解决方法
  7. 实例16:python
  8. mysql索引之二级索引学习总结
  9. java模拟多个用户操作,JAVA 模拟多用户提交动作
  10. 查看高通kernel用哪个dsti
  11. Linux学习笔记11_系统操作、优化相关命令复习
  12. nlp自然语言处理_NLP自然语言处理基础
  13. 当p.1引脚的电平正跳变c语言程序,数字电路笔试题目1
  14. Bootstrap响应式布局之 col-xs col-sm col-md
  15. RocketMQ 源码分析 14 事务消息02
  16. MIPS处理器 CPU控制信号
  17. 西方文化寻根思潮的跨世纪演化——透视“新时代运动“
  18. 提高转化率的 3 个客户引导最佳实践
  19. 中国计算机专业的大学生相比于美国差在哪里?
  20. 30分钟java桌球小游戏_30分钟完成桌球小游戏项目

热门文章

  1. Apache Beam欲通过uber api获取大数据
  2. 王守仁的学前教育思想
  3. 软件测试用例设计实用经验之谈
  4. 《SpringBoot揭秘:快速构建微服务体系》—第2章2.4节本章小结*
  5. 转发离线安装 Android Studio 更新
  6. sscanf函数中类型不匹配警告引发的BUG和思考
  7. windows下Python到linux运行遇到的字符编码问题
  8. VMware中High Availability (HA),的含义
  9. 【智能驾驶】车道线检测中的新IPM(逆透视变换)算法实验效果
  10. OBS集成WebRTC