<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>MySQL on 随手记</title><link>https://www.bufio.cn/tags/mysql/</link><description>Recent content in MySQL on 随手记</description><generator>Hugo</generator><language>zh-cn</language><copyright>© 2026 &lt;a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener"&gt;苏ICP备2023022553号-1&lt;/a&gt;</copyright><lastBuildDate>Wed, 29 Apr 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://www.bufio.cn/tags/mysql/index.xml" rel="self" type="application/rss+xml"/><item><title>MySQL B+ Tree 机制与算法详解</title><link>https://www.bufio.cn/posts/mysql-b-plus-tree-mechanisms-and-algorithms/</link><pubDate>Wed, 29 Apr 2026 00:00:00 +0800</pubDate><guid>https://www.bufio.cn/posts/mysql-b-plus-tree-mechanisms-and-algorithms/</guid><description>&lt;h2 id="为什么数据库普遍选择-b-tree"&gt;为什么数据库普遍选择 B+ Tree&lt;/h2&gt;
&lt;p&gt;如果只从算法课本看，查找一个有序集合有很多选择：数组可以二分，哈希表可以做到平均 O(1)，红黑树、AVL 树可以做到 O(logN)。但数据库的核心问题不是“CPU 内存里怎么找”，而是“磁盘或 SSD 上的数据怎么少读几次”。&lt;/p&gt;
&lt;p&gt;MySQL 的 InnoDB 存储引擎把表数据和索引组织成页。默认情况下，一个页通常是 16KB。一次查询如果每深入一层索引就需要读取一个页，那么树的高度越低，I/O 次数就越少。B+ Tree 的核心优势就在这里：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每个节点能存放很多 key，树的分叉数很大，高度很低。&lt;/li&gt;
&lt;li&gt;所有真实记录都在叶子节点，非叶子节点只负责导航。&lt;/li&gt;
&lt;li&gt;叶子节点之间按 key 顺序连接，非常适合范围查询和排序扫描。&lt;/li&gt;
&lt;li&gt;节点大小天然适合数据库页，可以和磁盘读写单位对齐。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以，B+ Tree 不是为了在理论复杂度上压倒所有结构，而是为了适配数据库最昂贵的资源：随机 I/O。&lt;/p&gt;
&lt;h2 id="从二叉树到-b-tree"&gt;从二叉树到 B+ Tree&lt;/h2&gt;
&lt;p&gt;普通二叉搜索树每个节点最多两个孩子。即使它保持平衡，一千万条数据的高度也大约是二十多层。放在内存里问题不大，放在数据库里就意味着一次查找可能触发很多次随机页读取。&lt;/p&gt;
&lt;p&gt;B Tree 和 B+ Tree 解决的是“分叉太少”的问题。一个节点可以保存多个 key 和多个孩子指针。例如节点中有这些分隔 key：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[10 | 20 | 30]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;它可以把搜索空间分成四段：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(-∞, 10) [10, 20) [20, 30) [30, +∞)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样，一个节点不是二选一，而是多路分发。只要一个页中能放下足够多的 key 和指针，树的高度就会非常低。&lt;/p&gt;
&lt;p&gt;B+ Tree 相比 B Tree 又进一步做了一个重要取舍：非叶子节点不存放完整数据记录，只存放用于导航的 key 和子节点页号；所有完整记录都放在叶子节点。这样非叶子节点更小，能容纳更多 key，树也就更矮。&lt;/p&gt;
&lt;h2 id="b-tree-的基本结构"&gt;B+ Tree 的基本结构&lt;/h2&gt;
&lt;p&gt;一棵典型 B+ Tree 可以分成三类节点：&lt;/p&gt;</description></item><item><title>MySQL 各个模块与核心机制：从一条 SQL 理解数据库原理</title><link>https://www.bufio.cn/posts/mysql-architecture-and-core-mechanisms/</link><pubDate>Tue, 28 Apr 2026 18:05:26 +0800</pubDate><guid>https://www.bufio.cn/posts/mysql-architecture-and-core-mechanisms/</guid><description>&lt;p&gt;MySQL 是最常见的关系型数据库之一。很多人一开始使用 MySQL，关注的是如何写 &lt;code&gt;SELECT&lt;/code&gt;、&lt;code&gt;INSERT&lt;/code&gt;、&lt;code&gt;UPDATE&lt;/code&gt;、&lt;code&gt;DELETE&lt;/code&gt;，但如果想进一步理解性能优化、事务一致性、主从复制、锁等待、索引失效等问题，就需要了解 MySQL 内部由哪些模块组成，以及这些模块之间如何协作。&lt;/p&gt;
&lt;p&gt;本文会以科普的方式讲解 MySQL 的整体架构、核心模块和重要机制。你不需要先成为数据库内核开发者，也可以建立一套清晰的理解框架。&lt;/p&gt;
&lt;h2 id="1-mysql-的整体架构"&gt;1. MySQL 的整体架构&lt;/h2&gt;
&lt;p&gt;可以把 MySQL 大致分成两层：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;客户端
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;连接层
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SQL 层：解析器、预处理器、优化器、执行器、权限检查、函数、视图、触发器等
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;存储引擎层：InnoDB、MyISAM、Memory 等
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;磁盘文件与操作系统
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中最重要的设计点是：MySQL 的 SQL 层和存储引擎层是分离的。&lt;/p&gt;
&lt;p&gt;SQL 层负责理解 SQL、检查权限、生成执行计划、调用存储引擎接口。存储引擎层负责真正的数据读写、索引组织、事务、锁、崩溃恢复等底层工作。&lt;/p&gt;
&lt;p&gt;这也是为什么 MySQL 可以支持不同存储引擎。最常用的是 InnoDB，它是现代 MySQL 默认存储引擎，支持事务、行级锁、MVCC、崩溃恢复等关键能力。&lt;/p&gt;
&lt;h2 id="2-连接层客户端如何连上-mysql"&gt;2. 连接层：客户端如何连上 MySQL&lt;/h2&gt;
&lt;p&gt;当应用程序连接 MySQL 时，首先经过连接层。&lt;/p&gt;
&lt;p&gt;连接层主要负责：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;建立连接
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;认证用户名和密码
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;检查客户端权限
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;维护连接状态
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;处理连接线程
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;管理连接超时
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;常见连接方式包括 TCP 连接和 Unix Socket 连接。&lt;/p&gt;
&lt;p&gt;例如应用程序使用如下连接信息：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;host=127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;port=3306
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;user=app_user
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;password=******
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;database=app_db
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MySQL 会先验证账号密码，再根据权限表判断用户是否有访问某个库、表、列或执行某类操作的权限。&lt;/p&gt;</description></item></channel></rss>