当前位置: 首页 > news >正文

面试tips--MySQLRedis--Redis 有序集合用跳表不用B+树 MySQL用B+树作为存储引擎不用跳表:原因如下

一、Redis的有序集合为什么使用 跳表 而不是 B+ 树

  1. 实现简单,内存友好

    • 跳表是基于链表 + 多级索引实现的,逻辑简单,代码量少,容易维护。

    • Redis 的数据大多放在内存中,不需要像 B+ 树那样考虑磁盘 IO 的分层读取。

  2. 范围查询更自然

    • 跳表通过多级索引快速定位,然后像链表一样向后遍历,非常适合区间查找。

    • Redis 的 有序集合 (Sorted Set, zset) 正是基于 跳表 + 哈希表 实现的。

    • 比如 ZRANGE score 100 200,用跳表可以顺序扫,很高效。

  3. 更新(插入/删除)更快

    • 跳表的插入/删除只需要修改相邻节点指针,平均复杂度 O(log n),实现简单。

    • B+ 树插入/删除可能触发节点分裂/合并,代码复杂,开销更大。

  4. 内存访问更高效

    • 跳表是链表结构,节点分布更灵活,避免了频繁的树旋转或分裂操作。

    • Redis 运行在内存,随机访问代价低,不需要像磁盘存储那样追求树的高扇出特性。

👉 总结:
Redis 选择跳表是因为它简单、高效、适合内存操作,且范围查询支持非常自然。


二、MySQL 为什么使用 B+ 树 而不是 跳表

  1. 磁盘 IO 优化

    • MySQL 数据量通常非常大,无法全部放入内存,必须依赖磁盘。

    • B+ 树的每个节点可以存放多个键值(扇出高),高度低(一般 3~4 层就能存下上亿数据)。

    • 查找数据时,磁盘访问次数非常少,大幅减少 IO。

  2. 顺序遍历高效

    • B+ 树的叶子节点是 链表连接 的,天然支持范围查询。

    • 在磁盘上,B+ 树叶子节点通常是连续存储的,顺序读比跳表的随机指针跳转更高效。

  3. 更新时的平衡性

    • B+ 树在插入/删除时通过分裂/合并保持平衡,保证了查询效率的稳定。

    • 跳表在磁盘环境下不如 B+ 树稳定(随机访问磁盘比顺序访问代价大很多)。

  4. 更适合大数据量存储

    • 跳表是链表结构,节点分散,磁盘存储会产生大量随机 IO。

    • B+ 树节点利用率高、层数少,非常适合海量数据存储。

👉 总结:
MySQL 选择 B+ 树是因为它能最大限度减少磁盘 IO,且支持高效的范围查询,非常适合大规模持久化存储。


三、总结对比表

特性跳表 (Redis)B+ 树 (MySQL)
存储环境内存磁盘
实现复杂度简单复杂
查询复杂度O(log n)O(log n)
范围查询高效(链表顺序遍历)高效(叶子链表 + 磁盘顺序读)
插入/删除快速,指针调整即可可能分裂/合并,开销大
内存/磁盘友好内存友好,指针操作快磁盘友好,减少 IO
应用场景Redis 有序集合(zset)MySQL 索引(B+ 树索引)

一句话记忆

  • Redis 用跳表 → 追求内存效率、插入删除简单、范围查询自然。

  • MySQL 用 B+ 树 → 追求磁盘效率、减少 IO、适合大数据量存储。

http://www.xdnf.cn/news/1429885.html

相关文章:

  • 卫朋:基于IPD思维的产品规划逻辑
  • Android Binder 驱动 - Media 服务启动流程
  • 三格电子CAN总线通信原理及在消防领域中的应用
  • 第三章:生活重构:当程序员不再只是“码农“
  • 威科夫与强化学习状态
  • @Apache Hive 介绍部署与使用详细指南
  • 跨越产业技术障碍、创新制造模式的智慧工业开源了
  • HiMarket:开源AI中台革命——企业智能化的新基建
  • 从全球视角到K8s落地的Apache IoTDB实战
  • 2025年渗透测试面试题总结-47(题目+回答)
  • C++入门自学Day17-- 模版进阶知识
  • [re_1] const|cap|zookper|snowflake
  • maven私有仓库配置
  • 【linux】firewall防火墙
  • 急招 MySQL / PG DBA,欢迎自荐或推荐朋友!推荐有奖!
  • Delphi 5 操作Word表格选区问题解析
  • 玩转Docker | 使用Docker部署Haptic笔记管理应用
  • Resemble Enhance:AI语音增强技术的革新之作
  • Rsync + Rsyncd 从入门到项目实战:自动化备份全攻略
  • 阅读Linux 4.0内核RMAP机制的代码,画出父子进程之间VMA、AVC、anon_vma和page等数据结构之间的关系图。
  • innovus: postRoute如何加shielding
  • ARM - GPIO 标准库开发
  • 【Python3教程】Python3高级篇之XML解析
  • 3dmax烘培插件3dmax法线贴图烘焙教程glb和gltf元宇宙灯光效果图烘焙烘焙光影贴图支持VR渲染器
  • 10 51单片机之DS1302实时时钟
  • Java集合源码解析之ArrayList
  • 网络共享协议
  • 【Vue2 ✨】 Vue2 入门之旅(五):组件化开发
  • 车载刷写架构 --- ECU软件更新怎么保证数据的正确性?
  • MATLAB矩阵及其运算(三)矩阵的创建