为什么redis用跳表不用b+树,而mysql用b+树而不是跳表?

写在前面

上一篇文章中,我们深度解析了redis中的跳表结构,而b+树的结构我们很久之前就讲过了,那么我们知道了redis的有序集合用的是跳表,而mysql的innodb引擎用的是b+树存储,但这是为什么呢?为什么redis用跳表不用b+树,而mysql用b+树而不是跳表?这篇文章我们就来讲一下。

1. B+树和跳表结构对比

我们分别对这两个结构进行读、写操作两个场景来做分析。

1.1 B+树结构

  • 读操作:我们知道 B+树 的结构中每个结点都是一个16k的数据页,能存放较多的索引信息,三层左右就可以存储3kw左右的数据。查询一次数据,最多三次磁盘IO。
  • 写操作:随着数据的增加,B+树为了保持自身平衡而需要调整自身的树高,这背后有相对复杂逻辑来做平衡调整。

所以B+树这类数据结构适合大量数据(相比于redis),而大量的数据肯定不能全放内存里,必定是需要存放在磁盘,而磁盘的读写又很慢,B+数的灵魂在于索引,索引作用是为了加速磁盘io

但是redis又是一个内存数据库,索引在内存中的作用不大了,相反B+数复杂的平衡逻辑会使得插入变慢,redis这类追求高速的单进程数据库是不建议有这类慢操作的。

1.2 跳表结构

  • 读操作:一个结点存放一条数据,如果像上面的mysql一样存储3kw左右的数据,即使每次都能达到最优的二分,也要找2的25次方左右。 当然redis也不会有哪个key会存储3kw的数据,这就算大key了,是不允许的。而且与磁盘io不同,内存是很快的。
  • 写操作:与拆分合并数据页不同,一个节点直接插入一条数据。逻辑相对来说比较简单,也很快速,没有平衡的复杂过程。

2. 总结

Redis 使用跳表的原因:

  • 内存数据库,查询、插入、删除的效率高,且实现简单,适合高并发、低延迟的内存操作。
  • 内存管理灵活,不需要像 B+树那样复杂的节点分裂和合并操作,这些操作也比较耗时。并且B+的最大的索引优势在内存中作用不大。

MySQL 使用 B+树的原因:

  • 适合磁盘存储和大规模数据,能够高效进行范围查询和排序,支持复杂的事务管理。
  • 适合持久化存储,在数据量很大的情况下,通过索引结构能够优化磁盘 I/O,B+树能够保持查询性能。

参考

1 https://15721.courses.cs.cmu.edu/spring2018/papers/08-oltpindexes1/pugh-skiplists-cacm1990.pdf

2 https://opensource.googleblog.com/2013/01/c-containers-that-save-memory-and-time.html

相关推荐
J_bean11 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean11 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
天疆说16 小时前
01 硬件选型与 llama.cpp 部署:4× RTX 5880 Ada 跑 DeepSeek-V4-Flash
java·redis·llama
嘟嘟071716 小时前
Next.js 博客左侧笔记列表是怎么从 Redis 渲染出来的?从组件、children 到动态路由一次讲清
redis·react.js·前端工程化
冰暮流星17 小时前
mysql之分组查询
数据库·mysql
NiceCloud喜云18 小时前
腾讯云国际版云数据库选型:MySQL、Redis 怎么按业务架构来判断
数据库·mysql·腾讯云
ew4521818 小时前
MySQL JOIN 关联语法、差异、标准用法、经典坑点汇总
数据库·mysql
Rain的Java大神之路19 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
Amir_zy21 小时前
Redis测试方法全攻略:冒烟、压测与稳定性验证
redis·压力测试
白狐_7981 天前
408数据结构第7章:B树①——基础概念与结构
数据结构·b树