导读

在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/Ext4

https://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+树索引就可以了。

转自:http://www.cnblogs.com/zengkefu/p/5647279.html

mysql索引平衡树hash_MySQL B+树索引和哈希索引的区别相关推荐

  1. Mysql 索引为啥使用B+树?不用哈希或B树?红黑树?

    哈希索引:单个记录的增删改查效率高,时间复杂度是O(1):但对于范围查询需要全表扫描: B树: 1 范围查询时效率比B+树低(B树的叶子结点缺少有序链表): 2 内部节点(非叶子结点)既存储数据也存储 ...

  2. 索引存储和散列存储(哈希)的区别吧

    两者都一定的相似性,可以加快检索速度,是一种存储结构. 但是索引的方式相当于给一个本书加一个目录,这样子就可以快速找到每一个章节.好处就是增加检索速度,坏处就是增加了书的厚度,而且如果改变了书的内容, ...

  3. MySQL B+树索引和哈希索引介绍

    * GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 索引介绍 索引是一种特殊的数据库结构,被设计用来快速查询数据库表中的特定记录.索引有多种类型,就像字典有拼音查找和偏旁 ...

  4. MySQL索引(B+Tree 索引、哈希索引、全文索引、 空间数据索引)、索引优化、优点、使用场景

    1. MySQL 索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现. 1.1 B+Tree 索引 是大多数 MySQL 存储引擎的默认索引类型. 因为不再需要 ...

  5. 数据库中的索引技术——哈希索引

    1.哈希索引 哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效.对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值, ...

  6. 16kb等于多少b_面试官:MySQL索引为何选择B+树?

    声明 本文所述的各种数据结构(二叉树等),均不考虑重复值的情况,本文简述各种数据结构的区别仅仅只是为了理解MySQL索引的需要而做的铺垫. 什么是索引 提起索引,大家都知道,建立索引可以让数据库查询更 ...

  7. 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...

  8. Mysql InnoDB B+树索引和哈希索引的区别? MongoDB 为什么使用B-树?

    B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. B+树 B+树是为磁盘及其他存储辅助设备而设计一种平衡查找树(不是二叉树).B+ ...

  9. 面试官:为什么MySQL的索引要使用B+树,而不是其它树?比如B树?

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/exC8JdQS InnoDB的一棵B+树可以存放多少行数 ...

  10. 为什么MySQL数据库要用B+树存储索引?

    小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 话说两个多月前,小史通过了A厂的一面,两个多月后的今天,小史终于等到了A厂的二面. 简单 ...

最新文章

  1. [BZOJ2947]促销(Splay)
  2. linux端口转发到windows,Linux及Windows基于工具的端口转发
  3. SSH服务--Linux学习笔记
  4. 元器件大一点好,还是小一点好?
  5. Unknown column '' in 'field list'
  6. android中的后退功能,如何在Android应用中实现一个返回键功能
  7. 判断玫瑰花数c语言程序设计教程课后答案,编写程序判断某个四位整数是否为玫瑰花数(用自定义函数)...
  8. 【Vue 3.0 新特性(一)】源码的组织方式
  9. for jq 嵌套_遍历嵌套列表 – jQuery
  10. 怎么将文件转换成linux文件,你如何在linux中创建一个将文件转换为大写...
  11. SQL中 left join 左表合并去重实用技巧
  12. 2019湖南职高计算机总分是多少,2019湖南高职单招一般多少分能过
  13. 浅谈CDQ分治与偏序问题
  14. bzoj4152 [AMPPZ2014]The Captain
  15. android 谷歌地图离线访问,谷歌升级Android版地图应用 支持离线使用
  16. Smarty - 下载
  17. 计算机技术和信息技术结合,浅谈通信技术与计算机技术融合发展
  18. 毕业设计之 ----基于微信小程序的商城购物系统
  19. 计算机科学与技术代码0812,一级学科代码及名称0812计算机科学与技术(2007年)本.doc...
  20. MATLAB 指定线型和颜色

热门文章

  1. Delphi 项目版本
  2. 微信接口_收货地址共享
  3. 非堵塞socket实现android手机与PC的文件传输
  4. css line-height多种用法与之间的区别
  5. 如何记才能不搞混绝对路径和相对路径
  6. JavaScript综述
  7. php7 magento速度优化,7个更快的加载速度的Magento优化快速提示
  8. java 新建pdf_java-如何关闭PDF文件以重新创建它? (正在...
  9. java 接口返回不带双引号_Java入门:基础知识
  10. mysql远程连接error 1045_启用远程MySQL连接:错误1045(28000):用户被拒绝访问