获得徽章 23
赞了这篇沸点
赞了这篇沸点
赞了这篇沸点
赞了这篇沸点
抽奖啦抽奖啦,为了庆祝我的开源项目突破1000star,抽两张价值59.9的JUST.FOTO大头贴拍摄券。
评论点赞就可以参与,当然帮给个star就更好了,今晚22:00开奖
dompdf.js 是我开源的一个存前端转矢量 PDF 的 js 库,详情介绍
juejin.cn
核心功能特性
✨ 使用简单 - 前端一行代码就可以实现转 PDF 功能
纯前端实现 pdf 生成 - 无需服务器介入
生成的是矢量 PDF- PDF 的文字可以搜索选中编辑,更小的文件体积,文字不会模糊
精准的页面分割处理- 避免页面元素被切割
🚀 可生成上千页的 PDF 文件- 对比一般方案( html2canvas+jspdf ),提升了几百倍
📦 自定义页眉页脚- 可以根据需求,自定义页眉页脚
评论点赞就可以参与,当然帮给个star就更好了,今晚22:00开奖
dompdf.js 是我开源的一个存前端转矢量 PDF 的 js 库,详情介绍
核心功能特性
✨ 使用简单 - 前端一行代码就可以实现转 PDF 功能
🚀 可生成上千页的 PDF 文件- 对比一般方案( html2canvas+jspdf ),提升了几百倍
📦 自定义页眉页脚- 可以根据需求,自定义页眉页脚
展开
13
12
赞了这篇沸点
标题:
MySQL 面试必问:为什么数据库索引用 B+ 树,而不是 B 树、红黑树、哈希表?
正文:
面试官:"MySQL 为什么用 B+ 树做索引?"
99% 的候选人会说"因为 B+ 树查询快"。但如果你能从底层原理讲清楚 B+ 树 vs B 树 vs 红黑树 vs 哈希表的区别,这轮面试基本稳了。
先说结论
B+ 树的三个杀手锏:
非叶子节点只存键,不存数据 → 树更矮,IO 次数更少
叶子节点存全部数据 → 查询性能稳定,时间复杂度恒等于树高
叶子节点串成双向链表 → 范围查询直接顺序遍历,不用回溯
这三点让它成为数据库索引的终极选择。
算一笔账
假设主键 BIGINT(8 字节),指针 6 字节。一个 16KB 的页只存键和指针:
每个条目 14 字节,一页能存 1170 个
3 层 B+ 树:1170 × 1170 × 16 ≈ 2000 万行
4 层 B+ 树:约 1120 亿行
面试时不需要精确计算,记住数量级:3 层千万级,4 层千亿级。实际业务 3-4 层足够。
对比其他数据结构
vs B 树:B 树非叶子节点也存数据,同样 16KB 的页能存的键更少 → 树更高 → IO 更多。范围查询时需要在各层反复跳转。
vs 红黑树:红黑树是二叉树,树高 log₂(N)。1000 万行数据树高约 24 层,意味着 24 次磁盘 IO。B+ 树只要 3-4 次。
vs 哈希表:哈希等值查询 O(1),但不支持范围查询、不支持排序。WHERE id > 100 这种查询直接寄了。
回表和覆盖索引
二级索引的叶子节点存的是"索引键 + 主键值",不是完整数据。通过二级索引查到主键后,还要去聚簇索引查完整数据——这个过程叫回表。
如果查询的列都在二级索引里,就不需要回表了,这就是覆盖索引。
💡 面试一句话总结:B+ 树矮 + 稳定 + 支持范围查询,是数据库索引的最优解。
MySQL 面试必问:为什么数据库索引用 B+ 树,而不是 B 树、红黑树、哈希表?
正文:
面试官:"MySQL 为什么用 B+ 树做索引?"
99% 的候选人会说"因为 B+ 树查询快"。但如果你能从底层原理讲清楚 B+ 树 vs B 树 vs 红黑树 vs 哈希表的区别,这轮面试基本稳了。
先说结论
B+ 树的三个杀手锏:
非叶子节点只存键,不存数据 → 树更矮,IO 次数更少
叶子节点存全部数据 → 查询性能稳定,时间复杂度恒等于树高
叶子节点串成双向链表 → 范围查询直接顺序遍历,不用回溯
这三点让它成为数据库索引的终极选择。
算一笔账
假设主键 BIGINT(8 字节),指针 6 字节。一个 16KB 的页只存键和指针:
每个条目 14 字节,一页能存 1170 个
3 层 B+ 树:1170 × 1170 × 16 ≈ 2000 万行
4 层 B+ 树:约 1120 亿行
面试时不需要精确计算,记住数量级:3 层千万级,4 层千亿级。实际业务 3-4 层足够。
对比其他数据结构
vs B 树:B 树非叶子节点也存数据,同样 16KB 的页能存的键更少 → 树更高 → IO 更多。范围查询时需要在各层反复跳转。
vs 红黑树:红黑树是二叉树,树高 log₂(N)。1000 万行数据树高约 24 层,意味着 24 次磁盘 IO。B+ 树只要 3-4 次。
vs 哈希表:哈希等值查询 O(1),但不支持范围查询、不支持排序。WHERE id > 100 这种查询直接寄了。
回表和覆盖索引
二级索引的叶子节点存的是"索引键 + 主键值",不是完整数据。通过二级索引查到主键后,还要去聚簇索引查完整数据——这个过程叫回表。
如果查询的列都在二级索引里,就不需要回表了,这就是覆盖索引。
💡 面试一句话总结:B+ 树矮 + 稳定 + 支持范围查询,是数据库索引的最优解。
展开
评论
2
赞了这篇沸点
赞了这篇沸点
![[吃瓜群众]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_10.42a731c.png)
![[呲牙]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_2.cd1e2bd.png)