欢迎来到 Bruce Ma 的技术博客 👋

我是马文龙(Bruce Ma),一名拥有10年经验的架构师和技术经理。

专注于:Java后端开发、微服务架构、AI应用落地、团队管理。

在这里分享技术见解、架构思考和管理经验。

欢迎

欢迎来到我的博客!

👋 Hello,World! 欢迎来到我的个人博客!我是马文龙(Bruce Ma),一名拥有10年经验的架构师和技术经理。这是我在互联网上的一个小角落,用来分享我的技术见解、架构思考和管理经验。 🎯 博客目标 我创建这个博客的主要目的是: 分享技术经验 - 把10年来积累的架构设计、微服务开发经验整理成文章 管理心得分享 - 分享团队管理、项目协调的实战经验 AI技术实践 - 记录AI应用落地、大模型集成的实际案例 技术思考总结 - 通过写作来梳理和深化对技术架构的理解 交流沟通 - 希望能和更多技术同行交流,共同成长 📝 内容方向 这个博客主要会包含以下几个方面的内容: 🏗️ 架构设计 微服务架构设计实践 分布式系统解决方案 高并发系统优化经验 技术选型和架构演进 💻 技术实战 Java后端开发进阶 Go语言实战应用 数据库设计与优化 消息队列应用实践 🤖 AI技术应用 大模型API集成实践 智能语音技术应用 AI产品落地经验 量化交易技术研究 👥 团队管理 技术团队建设 项目管理实践 跨部门协作经验 技术人员成长 🚀 未来计划 接下来我计划: 分享更多架构设计实战案例 整理AI应用落地系列文章 完善技术管理经验总结 添加互动功能,促进技术交流 定期更新高质量技术内容 🔧 技术栈 这个博客是使用以下技术栈搭建的: Hugo - 静态网站生成器,速度超快 PaperMod - 简洁优雅的 Hugo 主题 GitHub Pages - 免费可靠的静态网站托管 自定义域名 - brucema.cn 📬 联系方式 如果你对我的文章有任何想法或建议,欢迎通过以下方式联系我: ...

2025年06月24日 · 1 分钟 · 87 字 · Bruce Ma (马文龙)
MySQL B+树索引

MySQL索引为什么选择B+树?—— 数据结构深度解析

📚 学习背景 在数据库系统中,索引是提升查询性能的关键技术。MySQL作为最流行的关系型数据库,选择B+树作为索引的数据结构有其深层的技术原因。本文将从数据结构演进的角度,深入分析为什么MySQL最终选择了B+树。 🎯 好的索引数据结构需要满足的条件 磁盘存储的特点 MySQL的数据是持久化存储在磁盘上的,这带来了以下挑战: 磁盘访问速度:纳秒级的内存访问 vs 毫秒级的磁盘访问 性能差异:磁盘读取比内存慢上万倍甚至几十万倍 读写单位: 磁盘扇区:512B 操作系统块:4KB(8个扇区) 一次磁盘I/O操作读写8个扇区 索引数据结构的核心要求 基于磁盘存储的特点,好的索引数据结构必须满足: 最小化磁盘I/O次数 - 减少磁盘访问是性能优化的关键 高效单点查询 - 快速定位特定记录 高效范围查询 - 支持范围检索需求 良好的插入删除性能 - 保持结构稳定性 🔍 数据结构演进分析 1. 二分查找 - 基础思想 优点 时间复杂度:O(logn) 查询效率高 缺点 数组插入成本高:O(n) 每次查找需要计算中间位置 在磁盘环境下性能糟糕 1 2 3 4 查找过程: [1, 3, 5, 7, 9, 11, 13] 查找 7 1. 比较中间元素 7 ✓ 找到 2. 磁盘I/O次数:需要访问多个位置 2. 二分查找树 - 结构化改进 优点 天然的二分查找结构 插入删除相对简单:O(logn) 不需要计算中间位置 关键问题:退化成链表 1 2 3 4 5 6 7 8 9 极端情况插入序列:[1, 2, 3, 4, 5, 6, 7] 结果: 1 \ 2 \ 3 \ 4 ← 退化成链表,查询复杂度变为O(n) 磁盘I/O问题 树的高度 = 磁盘I/O次数 退化后查询效率急剧下降 3. 自平衡二叉树 - 解决退化问题 代表:AVL树、红黑树 优点 保持平衡,查询复杂度稳定在O(logn) 通过旋转操作维持平衡 根本问题:高度限制 1 2 3 4 5 6 二叉树特点:每个节点最多2个子节点 节点数量增加 → 树高度增加 → 磁盘I/O次数增加 示例:1000个节点的平衡二叉树 高度 ≈ log₂(1000) ≈ 10 查询需要10次磁盘I/O操作 4. B树 - 多叉树突破 核心思想:M叉树(M > 2) 优点 降低树的高度 减少磁盘I/O次数 支持多路查找 结构特点(以3阶B树为例) 每个节点最多2个数据,3个子节点 节点分裂机制保持平衡 查询过程示例 1 2 3 4 5 6 7 8 9 10 11 12 查找值9的过程: [4, 8] / | \ [1,2] [5,6] [10,12] / [9] 步骤: 1. 根节点[4,8]:9 > 8,走右子树 2. 节点[10,12]:9 < 10,走左子树 3. 找到节点[9] ✓ 磁盘I/O次数:3次 B树的问题 非叶子节点存储完整记录 - 浪费空间,增加I/O开销 范围查询效率低 - 需要中序遍历,涉及多次磁盘I/O 5. B+树 - 终极优化 核心改进 非叶子节点只存储索引,不存储记录数据 所有记录数据都在叶子节点 叶子节点通过链表连接,支持高效范围查询 冗余索引设计,提高增删效率 结构特点 1 2 3 4 5 B+树结构示例: [4, 8] ← 非叶子节点:只存索引 / | \ [1,2] [4,5,6] [8,9,10] ← 叶子节点:存储完整记录 ↔ ↔ ↔ ← 双向链表连接 🚀 B+树的核心优势 1. 单点查询优化 更矮胖的树结构 非叶子节点只存索引,可以存储更多索引项 相同数据量下,B+树比B树更"矮胖" 减少磁盘I/O次数 查询稳定性 所有查询都需要到达叶子节点 查询路径长度一致,性能稳定 2. 插入删除效率 冗余节点优势 删除操作主要在叶子节点进行 非叶子节点的冗余索引减少结构变化 避免复杂的树重构 对比示例 1 2 3 删除节点0004: B+树:直接从叶子节点删除,结构变化小 B树:可能触发复杂的节点合并和重构 3. 范围查询优化 链表遍历 1 2 3 4 范围查询:查找12月1日到12月12日的订单 1. 定位到12月1日所在的叶子节点 2. 通过链表向右遍历到12月12日 3. 无需多次从根节点查找 效率对比 B+树:O(logn) + 范围大小,通过链表遍历 B树:需要多次树遍历,多次磁盘I/O 🔧 MySQL中的B+树实现 InnoDB存储引擎特点 数据页结构 每个节点是一个数据页 默认大小:16KB 存储用户记录和各种元信息 双向链表 叶子节点间使用双向链表连接 支持正向和反向遍历 提升范围查询的灵活性 索引类型 聚簇索引 ...

2024年06月24日 · 2 分钟 · 377 字 · 马文龙