跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

MySQL 为什么用 B+ 树,Redis ZSet 为什么用跳表?

MySQL 索引底层采用 B+ 树以减少磁盘 IO 并支持范围查询;Redis ZSet 使用跳表加哈希表实现,适合内存操作且范围查询效率高;HashMap 在链表冲突严重时转为红黑树以平衡插入与查询性能。三者选型依据在于存储介质(磁盘 vs 内存)及具体业务场景对性能与实现的权衡。

imJackJia发布于 2026/3/16更新于 2026/4/2712 浏览
MySQL 为什么用 B+ 树,Redis ZSet 为什么用跳表?

面试场景还原

又是金三银四,会议室里的空气凝固。

面试官:我看你简历写精通各种中间件。那我问个基础的:MySQL 索引底层用什么?Redis 的 ZSet 底层用什么?HashMap 底层又用什么?

候选人:呃… MySQL 是 B+ 树,Redis ZSet 是跳表,HashMap 是红黑树?

面试官:没错。那为啥 Redis 不用 B+ 树?或者 MySQL 为啥不用跳表?它们选型的依据是什么?

候选人:这… 因为它们快?

面试官:回去等通知吧。

死记硬背八股文,遇到这种横向对比的场景题容易失分。今天带大家深入分析这些数据结构的选型逻辑。


MySQL 为什么使用 B+ 树

面试官:先说 MySQL,为啥 InnoDB 引擎非要用 B+ 树?用红黑树不行吗?

❌ 错误回答:因为 B+ 树更高级,名字带个加号。

✅ 正确回答:MySQL 的数据是存在磁盘上的,瓶颈在磁盘 IO。B+ 树就是为了减少磁盘 IO而生的。

把 B+ 树想象成一个超级扁平的多层书架:

  1. 矮胖结构:B+ 树一个节点能存很多索引,树的高度通常只有 3-4 层。这意味着查一条数据,最多读 3-4 次磁盘。
  2. 扫库神器:B+ 树的所有数据都挤在叶子节点,而且叶子节点之间有指针连着。你要查'ID 大于 100 的用户',找到 100 后顺着链表往后拉就行,支持范围查询非常高效。

如果是红黑树(二叉树),数据量一大,树高得吓人,读一次磁盘就像爬一层楼,效率低。

🔧 [实战场景]
这就是为啥千万别在 UUID 上建聚集索引,UUID 太长且无序,会让 B+ 树频繁分裂,影响性能。

-- 典型的 B+ 树应用场景:范围查询
-- 因为叶子节点有序且相连,这种 SQL 才能飞快执行
SELECT * FROM user WHERE age > 18 AND age < 30;

Redis ZSet 为什么选择跳表

面试官:既然 B+ 树这么强,Redis 的有序集合(ZSet)为啥不用?反而用个听起来很随意的'跳表'?

我:这就很有意思了。Redis 是内存数据库,它没那么在乎磁盘 IO 次数。

💡 [源码/原理]
ZSet 底层是用跳表(SkipList)+ 哈希表实现的。

  • 跳表是什么? 就像给链表加了多级索引。你要查第 100 号元素,不用从头数,通过上层索引'跳'着找。
  • 为啥不用红黑树?
    1. 范围查询:ZSet 常用来做排行榜(如 )。在跳表里找范围,找到起点直接往后遍历链表就行。在红黑树里找范围?你得中序遍历,逻辑复杂多了。
ZRANGE
  • 实现简单:跳表写起来代码少,调试容易。红黑树那旋转逻辑,维护成本高。
  • [面试官]:那 ZSet 怎么快速查单个元素?
    [我]:别忘了它还有个哈希表!查分数值直接 O(1) 搞定。

    // 伪代码感受下跳表的插入逻辑
    // 不像红黑树那样需要复杂的旋转平衡
    void insert(Node node) {
        int level = randomLevel(); // 随机决定这个节点有多高
        // 更新各层指针...
        // 纯链表操作,并发下也比树好控制(虽然 Redis 是单线程)
    }
    

    HashMap 里的红黑树机制

    面试官:好,最后问你 HashMap。JDK 1.8 引入了红黑树,这又是图啥?

    ✅ 正确回答:这是为了兜底。
    HashMap 主体还是数组 + 链表。只有当链表冲突太严重(链表长度 >= 8 且 数组容量 >= 64)时,链表才会变成红黑树。

    [面试官]:为啥这里不用跳表或者 B+ 树?
    [我]:

    1. 内存占用:B+ 树节点大,浪费内存。
    2. 查询性能:红黑树是平衡二叉树,查询复杂度 O(logN)。当冲突严重时,比链表的 O(n) 快得多。
    3. 为啥不用 AVL 树? AVL 树太严格平衡了,插入删除要疯狂旋转。红黑树平衡要求宽松,旋转次数少,更适合 HashMap 这种频繁插入删除的场景。

    易错点:HashMap 哈希计算

    这里有个90% 的人都会挂的易错点,关于 HashMap 的哈希计算。

    [面试官]:HashMap 的数组长度为啥非要是2 的次幂?

    ❌ 小白回答:呃… 可能是为了吉利?程序员喜欢 2?

    ✅ 揭秘:
    这是为了性能!
    计算索引位置本该用取模:hash % length。
    但如果 length 是 2 的次幂,hash % length 就等价于 hash & (length - 1)。
    位运算(&)比取模运算(%)快得多!

    而且,为了防止哈希冲突,HashMap 还搞了个扰动函数:把 hashCode 的高 16 位和低 16 位做异或。
    这也解释了为啥要用 2 的次幂——为了让高位特征也能参与运算,让数据散列得更均匀。

    // JDK 1.8 源码片段
    // 这行代码价值千金
    static final int hash(Object key) {
        int h;
        // 高 16 位异或低 16 位,这就是扰动函数
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    
    // 索引计算
    // n 必须是 2 的次幂,否则分布就不均匀了
    int index = (n - 1) & hash;
    

    总结清单

    在这里插入图片描述

    面试被问到数据结构选型,可以参考以下结论:

    1. MySQL (InnoDB):

      • 结构:B+ 树。
      • 理由:叶子节点存全量数据且相连,扫库、范围查询无敌,树矮减少磁盘 IO。
    2. Redis (ZSet):

      • 结构:跳表 + 哈希表。
      • 理由:内存操作,无需考虑磁盘 IO。跳表实现简单,范围查询(排行榜)比红黑树更高效。
    3. HashMap (JDK 1.8):

      • 结构:数组 + 链表 + 红黑树。
      • 理由:红黑树是对链表过长时的性能兜底。选择红黑树是因为它在插入性能和查询性能之间取得了平衡(比 AVL 树插入快)。

    技术没有银弹,只有取舍。下次面试官再问这种题,你就拿这些场景举例!

    目录

    1. 面试场景还原
    2. MySQL 为什么使用 B+ 树
    3. Redis ZSet 为什么选择跳表
    4. HashMap 里的红黑树机制
    5. 易错点:HashMap 哈希计算
    6. 总结清单
    • 💰 8折买阿里云服务器限时8折了解详情
    • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
    • 代充Chatgpt Plus/pro 帐号了解详情
    • 🤖 一键搭建Deepseek满血版了解详情
    • 一键打造专属AI 智能体了解详情
    极客日志微信公众号二维码

    微信扫一扫,关注极客日志

    微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

    更多推荐文章

    查看全部
    • JavaScript Proxy 代理机制与核心方法详解

    相关免费在线工具

    • Keycode 信息

      查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

    • Escape 与 Native 编解码

      JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

    • JavaScript / HTML 格式化

      使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

    • JavaScript 压缩与混淆

      Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online