news 2026/6/26 14:53:31

一文讲透索引数据结构——B-Tree / B+Tree / Hash 的特点及对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文讲透索引数据结构——B-Tree / B+Tree / Hash 的特点及对比

B-Tree

二叉树的缺点:

B-Tree(多路平衡查找树)

B+Tree

01-标准的B+Tree结构

演变过程:分裂时中间元素向上分裂,同时该中间元素会停留在分裂后的右子树中,这样才能保证所有的数据会出现在叶子结点

相对于B-Tree区别:

  • 所有的数据都会出现在叶子节点
  • 叶子节点形成一个单向链表

02-MySQL索引中的B+Tree结构

MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能

Hash

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中;

如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决

Hash索引特点:

  • Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< ,...)
  • 无法利用索引完成排序操作(Hash运算出来的结果是无序的)
  • 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引

存储引擎支持:

在MySQL中,支持hash索引的是Memory存储引擎

InnoDB中具有自适应hash功能,hash索引是InnoDB存储引擎根据B+Tree索引在指定条件下自动构建的

为什么InnoDB存储引擎选择使用B+tree索引结构?

  • 相对于二叉树层级更少,搜索效率高

对于B-Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,在保存相同数据量的情况下只能增加树的高度,导致性能降低

  • 如果采用B+Tree索引结构,不管查找哪一个数据都要到叶子结点当中才能找到对应的数据,搜索效率更稳定;
  • 在B+Tree索引结构中,叶子结点形成了一个双向链表,便于范围搜索和排序

  • 相对Hash索引,B+tree支持范围匹配排序操作

这个可以作为面试题好好理解下

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 1:11:37

Valentina服装设计软件终极指南:从零基础到高效制版

Valentina服装设计软件终极指南&#xff1a;从零基础到高效制版 【免费下载链接】fashionmaker Fashion Robot 项目地址: https://gitcode.com/gh_mirrors/fa/fashionmaker Valentina服装设计软件是一款功能强大的跨平台服装制版工具&#xff0c;它让设计师能够轻松创建…

作者头像 李华
网站建设 2026/6/26 3:45:12

智能编程新纪元:GPTstudio如何让R开发效率翻倍

智能编程新纪元&#xff1a;GPTstudio如何让R开发效率翻倍 【免费下载链接】gptstudio GPT RStudio addins that enable GPT assisted coding, writing & analysis 项目地址: https://gitcode.com/gh_mirrors/gp/gptstudio 作为一名R语言开发者&#xff0c;你是否曾…

作者头像 李华
网站建设 2026/6/26 3:46:58

昇腾CANN Tiling进化论 从切分艺术到性能极致的攀登之路

目录 1 摘要 2 技术原理 2.1 架构设计理念解析 2.2 核心算法实现 2.3 性能特性分析 3 实战部分 3.1 完整可运行代码示例 3.2 分步骤实现指南 步骤1&#xff1a;环境配置与工具准备 步骤2&#xff1a;基础Tiling实现与性能分析 3.3 常见问题解决方案 问题1&#xff…

作者头像 李华
网站建设 2026/6/26 11:59:22

AI如何帮你解决Spring的@Autowired依赖注入问题

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Spring Boot项目&#xff0c;使用Autowired自动注入一个UserService到UserController中。UserService包含一个方法getUserById(Long id)&#xff0c;返回用户信息。UserCon…

作者头像 李华
网站建设 2026/6/25 0:07:54

从零开始掌握LabVIEW:超详细图文安装激活全攻略

LabVIEW作为美国国家仪器公司开发的图形化编程神器&#xff0c;以其独特的框图编程方式在自动化测试、数据采集和工业控制领域占据重要地位。对于初学者来说&#xff0c;正确安装和配置LabVIEW是开启图形化编程之旅的第一步。本文将通过图文并茂的方式&#xff0c;为你提供从下…

作者头像 李华
网站建设 2026/6/25 1:17:06

传统vsAI:Android 12适配效率提升300%的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个效率对比工具&#xff0c;能够&#xff1a;1) 记录手动查找和修复Android 12显式值问题的时间&#xff0c;2) 使用AI自动完成相同任务的时间&#xff0c;3) 生成对比报告&a…

作者头像 李华