<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数据库深度专题：原理与实践 on PlumePHP</title><link>https://plumephp.com/posts/database/</link><description>Recent content in 数据库深度专题：原理与实践 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 14 Aug 2026 16:13:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/database/index.xml" rel="self" type="application/rss+xml"/><item><title>13. NewSQL 与分布式数据库</title><link>https://plumephp.com/database-distributed/</link><pubDate>Fri, 14 Aug 2026 16:13:00 +0800</pubDate><guid>https://plumephp.com/database-distributed/</guid><description>&lt;h2 id="1-cap-与-base"&gt;1. CAP 与 BASE&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CAP 定理: 分布式系统中不可能同时满足
 Consistency（一致性）
 Availability（可用性）
 Partition Tolerance（分区容错）

BASE 理论（妥协）:
 Basically Available（基本可用）
 Soft state（软状态）
 Eventually consistent（最终一致）
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="2-spanner"&gt;2. Spanner&lt;/h2&gt;
&lt;p&gt;Google 的全球分布式数据库：&lt;/p&gt;</description></item><item><title>12. SQL 注入与安全防护</title><link>https://plumephp.com/database-sql-injection/</link><pubDate>Fri, 14 Aug 2026 16:12:00 +0800</pubDate><guid>https://plumephp.com/database-sql-injection/</guid><description>&lt;h2 id="1-注入类型"&gt;1. 注入类型&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 联合注入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39; UNION SELECT password FROM users --
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;-- 布尔盲注
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39; AND 1=2 --
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;-- 时间盲注
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SLEEP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 堆叠注入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;; DROP TABLE users; --
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-防御"&gt;2. 防御&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方法&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;参数化查询&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;?&lt;/code&gt; 占位符，预编译&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ORM&lt;/td&gt;
					&lt;td&gt;框架自动转义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;输入验证&lt;/td&gt;
					&lt;td&gt;白名单校验&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;最小权限&lt;/td&gt;
					&lt;td&gt;应用账号只给必要权限&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;WAF&lt;/td&gt;
					&lt;td&gt;检测 SQL 关键字&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ❌ 拼接 SQL&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SELECT * FROM users WHERE name = &amp;#39;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ✅ 参数化&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SELECT * FROM users WHERE name = ?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pstmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="延伸阅读"&gt;延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://plumephp.com/database-distributed/"&gt;NewSQL 与分布式数据库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>11. 数据库设计范式与反范式</title><link>https://plumephp.com/database-normalization/</link><pubDate>Fri, 14 Aug 2026 16:11:00 +0800</pubDate><guid>https://plumephp.com/database-normalization/</guid><description>&lt;h2 id="1-范式定义"&gt;1. 范式定义&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;**范式（Normalization）**是关系数据库设计的一套标准，用于减少数据冗余、避免更新异常。每提升一级范式，约束条件更严格。&lt;/p&gt;</description></item><item><title>10. 读写分离与分库分表</title><link>https://plumephp.com/database-read-write-split/</link><pubDate>Fri, 14 Aug 2026 16:10:00 +0800</pubDate><guid>https://plumephp.com/database-read-write-split/</guid><description>&lt;h2 id="1-读写分离架构"&gt;1. 读写分离架构&lt;/h2&gt;
&lt;h3 id="11-为什么需要读写分离"&gt;1.1 为什么需要读写分离&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;大多数业务场景&lt;strong&gt;读多写少&lt;/strong&gt;（读:写 ≈ 8:1 ~ 50:1）。将读请求分发到多个从库，可线性扩展读性能。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;单库架构的问题：

 App ──→ MySQL
 │
 ├── 读请求（80% CPU）
 └── 写请求（20% CPU）
 
 读请求增加 → CPU 100% → 所有请求变慢

读写分离架构：

 写请求 ──→ [Master] ──→ 异步复制 ──→ [Slave 1]
 ──→ [Slave 2]
 ──→ [Slave 3]
 
 读请求 ──→ [负载均衡器] ──→ Slave 1 / Slave 2 / Slave 3
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="12-实现方式"&gt;1.2 实现方式&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方式&lt;/th&gt;
					&lt;th&gt;原理&lt;/th&gt;
					&lt;th&gt;代表产品&lt;/th&gt;
					&lt;th&gt;侵入性&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;代理层&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;独立进程解析 SQL 路由&lt;/td&gt;
					&lt;td&gt;MySQL Router、ProxySQL、MaxScale&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;中间件&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;分库分表中间件内置读写分离&lt;/td&gt;
					&lt;td&gt;ShardingSphere、MyCat&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;应用层&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;代码中配置多数据源&lt;/td&gt;
					&lt;td&gt;Spring RoutingDataSource&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Spring Boot 应用层读写分离&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Configuration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DataSourceConfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Bean&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DataSource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;routingDataSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Qualifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;masterDataSource&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DataSource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nd"&gt;@Qualifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;slaveDataSource&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DataSource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slave&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DynamicRoutingDataSource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DynamicRoutingDataSource&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;master&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;slave&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slave&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTargetDataSources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setDefaultTargetDataSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Service 方法指定数据源&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Transactional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;readOnly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 走 Slave&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getOrders&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Transactional&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 走 Master&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="13-复制延迟问题"&gt;1.3 复制延迟问题&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;写 Master ──→ 复制到 Slave（延迟 1ms ~ 数秒）
 │
 └──→ 用户立即读 Slave → 读不到刚写入的数据！

解决策略：
1. 关键读走 Master（写入后立即读取的场景）
2. 缓存补偿（写入后先更新缓存，读时先查缓存）
3. 半同步复制（Semi-Sync：至少一个 Slave 确认后再返回）
4. 会话绑定（同一连接内写后读走 Master）
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="2-分库分表"&gt;2. 分库分表&lt;/h2&gt;
&lt;h3 id="21-何时需要分库分表"&gt;2.1 何时需要分库分表&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;指标&lt;/th&gt;
					&lt;th&gt;建议分片&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;单表数据量&lt;/td&gt;
					&lt;td&gt;&amp;gt; 500万行（MySQL）/ &amp;gt; 1亿（PostgreSQL）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;单库磁盘&lt;/td&gt;
					&lt;td&gt;&amp;gt; 500GB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;单库 QPS&lt;/td&gt;
					&lt;td&gt;&amp;gt; 5000（读）/ &amp;gt; 1000（写）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;单表索引大小&lt;/td&gt;
					&lt;td&gt;&amp;gt; 内存容量&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="22-分片策略"&gt;2.2 分片策略&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;策略&lt;/th&gt;
					&lt;th&gt;实现&lt;/th&gt;
					&lt;th&gt;优点&lt;/th&gt;
					&lt;th&gt;缺点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;哈希分片&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;hash(key) % N&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;数据均匀&lt;/td&gt;
					&lt;td&gt;扩容需迁移数据&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;范围分片&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;按 ID 或时间区间&lt;/td&gt;
					&lt;td&gt;范围查询友好&lt;/td&gt;
					&lt;td&gt;热点风险&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;列表分片&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;按枚举值映射&lt;/td&gt;
					&lt;td&gt;灵活可控&lt;/td&gt;
					&lt;td&gt;需人工维护&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;一致性哈希&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;哈希环 + 虚拟节点&lt;/td&gt;
					&lt;td&gt;扩容迁移少&lt;/td&gt;
					&lt;td&gt;实现复杂&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 按用户 ID 哈希分表&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tableName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;order_&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// order_0 ~ order_7&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 按月份分表&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tableName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;log_&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;YearMonth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DateTimeFormatter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofPattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;yyyyMM&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// log_202601, log_202602, ...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="23-shardingsphere-实战"&gt;2.3 ShardingSphere 实战&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# shardingsphere-config.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;dataSources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ds_0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;!!com.zaxxer.hikari.HikariDataSource&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jdbcUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;jdbc:mysql://db0:3306/shop&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ds_1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;!!com.zaxxer.hikari.HikariDataSource&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;jdbcUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;jdbc:mysql://db1:3306/shop&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;shardingRule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;actualDataNodes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ds_${0..1}.orders_${0..7}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tableStrategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;shardingColumn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;user_id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;algorithmExpression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;orders_${user_id % 8}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;databaseStrategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;shardingColumn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;user_id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;algorithmExpression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ds_${user_id % 2}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;keyGenerator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;SNOWFLAKE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order_id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="3-分布式主键"&gt;3. 分布式主键&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方案&lt;/th&gt;
					&lt;th&gt;原理&lt;/th&gt;
					&lt;th&gt;优点&lt;/th&gt;
					&lt;th&gt;缺点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Snowflake&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;41位时间+10位机器+12位序列&lt;/td&gt;
					&lt;td&gt;趋势递增、高性能&lt;/td&gt;
					&lt;td&gt;依赖时钟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Leaf&lt;/strong&gt;（美团）&lt;/td&gt;
					&lt;td&gt;号段模式&lt;/td&gt;
					&lt;td&gt;稳定、可控&lt;/td&gt;
					&lt;td&gt;需维护号段表&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Redis 自增&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;INCR&lt;/td&gt;
					&lt;td&gt;简单&lt;/td&gt;
					&lt;td&gt;单点、网络开销&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;数据库步长&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;auto_increment_offset&lt;/td&gt;
					&lt;td&gt;简单&lt;/td&gt;
					&lt;td&gt;扩展性差&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Snowflake 实现（简化）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SnowflakeIdGenerator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;workerId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lastTimestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;synchronized&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;nextId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lastTimestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RuntimeException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Clock moved backwards&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lastTimestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0xFFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 12 bit&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tilNextMillis&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lastTimestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EPOCH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;workerId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="4-数据迁移"&gt;4. 数据迁移&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;双写迁移方案（不停机）：

阶段 1：双写
 应用同时写入旧库和新库（新库异步）
 读仍然走旧库

阶段 2：数据校验 + 补平
 对比旧库和新库数据差异
 修复不一致数据

阶段 3：灰度切读
 1% 流量读新库 → 10% → 50% → 100%
 监控错误率和延迟

阶段 4：切写
 写操作切换到新库
 停止旧库写入

阶段 5：下线旧库
 保留一段时间后归档删除
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="延伸阅读"&gt;延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://plumephp.com/java-database-sharding/"&gt;Java 数据库分片&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plumephp.com/database-mysql-innodb/"&gt;MySQL InnoDB 存储引擎&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plumephp.com/database-replication/"&gt;主从复制与数据同步&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>09. 主从复制与数据同步</title><link>https://plumephp.com/database-replication/</link><pubDate>Fri, 14 Aug 2026 16:09:00 +0800</pubDate><guid>https://plumephp.com/database-replication/</guid><description>&lt;h2 id="1-复制架构"&gt;1. 复制架构&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; ┌──────────────┐
 │ Client │
 └──────┬───────┘
 │
 ┌─────▼─────┐
 │ Master │ ← 处理写请求，记录 binlog
 │ (主库) │
 └─────┬─────┘
 │ binlog dump
 ┌─────────────┼─────────────┐
 ↓ ↓ ↓
 ┌────────┐ ┌────────┐ ┌────────┐
 │ Slave 1│ │ Slave 2│ │ Slave 3│ ← 读请求
 │(IO线程) │ │(IO线程) │ │(IO线程) │
 │(SQL线程)│ │(SQL线程)│ │(SQL线程)│
 └────────┘ └────────┘ └────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="2-复制模式"&gt;2. 复制模式&lt;/h2&gt;
&lt;h3 id="21-异步复制asynchronous"&gt;2.1 异步复制（Asynchronous）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Client → Master (写入成功) → 立即返回
 ↓ 后台异步
 Slave（可能有延迟）

特点：快，不阻塞客户端，但 Master 宕机时可能丢失未同步数据
MySQL 默认模式
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="22-半同步复制semi-synchronous"&gt;2.2 半同步复制（Semi-Synchronous）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Client → Master (prepare) → 等待至少 1 个 Slave ACK
 ↓
 Slave (收到 relay log)
 → ACK → Master commit → 返回客户端

特点：返回慢一些，但保证至少一个 Slave 已接收数据，降低丢失风险
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="23-组复制group-replication"&gt;2.3 组复制（Group Replication）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;多主或单主模式，多数派确认后提交（Paxos 协议）。
自动故障检测和切换，数据强一致。
MySQL 5.7+ 内置。
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;一致性&lt;/th&gt;
					&lt;th&gt;性能&lt;/th&gt;
					&lt;th&gt;故障场景数据丢失&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;异步&lt;/td&gt;
					&lt;td&gt;最终一致&lt;/td&gt;
					&lt;td&gt;最高&lt;/td&gt;
					&lt;td&gt;可能丢失所有未同步&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;半同步&lt;/td&gt;
					&lt;td&gt;至少一个副本&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;最多丢失一个事务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;组复制&lt;/td&gt;
					&lt;td&gt;强一致&lt;/td&gt;
					&lt;td&gt;较低&lt;/td&gt;
					&lt;td&gt;不丢失（多数派确认）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="3-binlog"&gt;3. Binlog&lt;/h2&gt;
&lt;h3 id="31-格式"&gt;3.1 格式&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;格式&lt;/th&gt;
					&lt;th&gt;内容&lt;/th&gt;
					&lt;th&gt;优点&lt;/th&gt;
					&lt;th&gt;缺点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;STATEMENT&lt;/td&gt;
					&lt;td&gt;原始 SQL 语句&lt;/td&gt;
					&lt;td&gt;体积小&lt;/td&gt;
					&lt;td&gt;非确定性函数（UUID/ NOW()）问题&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;ROW&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;行变更前后镜像&lt;/td&gt;
					&lt;td&gt;精确、安全&lt;/td&gt;
					&lt;td&gt;体积大（UPDATE 全表时膨胀）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MIXED&lt;/td&gt;
					&lt;td&gt;混合策略&lt;/td&gt;
					&lt;td&gt;平衡&lt;/td&gt;
					&lt;td&gt;复杂&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 推荐配置（ROW 格式）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;binlog_format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ROW&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;binlog_row_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;FULL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- FULL / MINIMAL / NOBLOB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- ROW 格式示例
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- UPDATE users SET status = &amp;#39;active&amp;#39; WHERE id = 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- binlog 记录：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- before_image: id=1, status=&amp;#39;inactive&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- after_image: id=1, status=&amp;#39;active&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-gtid全局事务标识"&gt;3.2 GTID（全局事务标识）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GTID = Master_UUID:Transaction_Sequence

示例：
 a1b2c3d4-e5f6-7890-abcd-ef1234567890:1-100
 
优势：
 - 自动定位复制位点，避免 file:position 管理
 - 故障切换更简单（CHANGE MASTER TO ... AUTO_POSITION=1）
 - 避免跳过事务导致的脑裂
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="4-复制延迟"&gt;4. 复制延迟&lt;/h2&gt;
&lt;h3 id="41-延迟原因"&gt;4.1 延迟原因&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;原因&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;单线程 SQL 线程&lt;/td&gt;
					&lt;td&gt;经典 MySQL 只有 1 个 SQL 线程重放&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;大事务&lt;/td&gt;
					&lt;td&gt;一个事务修改大量行，Slave 重放慢&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Slave 性能差&lt;/td&gt;
					&lt;td&gt;Slave 硬件弱于 Master&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;锁竞争&lt;/td&gt;
					&lt;td&gt;Slave 上也有读请求，与 SQL 线程竞争&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="42-并行复制"&gt;4.2 并行复制&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- MySQL 5.7+ 并行复制配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slave_parallel_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;LOGICAL_CLOCK&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slave_parallel_workers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- SQL 线程数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- LOGICAL_CLOCK：基于组提交（同一时刻提交的事务可并行）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- DATABASE：基于库级别并行（不同库的事务并行）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="43-监控延迟"&gt;4.3 监控延迟&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 查看延迟
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SLAVE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;STATUS&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;G&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Seconds_Behind_Master: 0 ← 延迟秒数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 更精确的方法（pt-heartbeat）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Master 每秒写 heartbeat 表，Slave 计算差值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="延伸阅读"&gt;延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://plumephp.com/database-read-write-split/"&gt;读写分离与分库分表&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plumephp.com/database-mysql-innodb/"&gt;MySQL InnoDB 存储引擎&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>08. 连接池设计与原理</title><link>https://plumephp.com/database-connection-pooling/</link><pubDate>Fri, 14 Aug 2026 16:08:00 +0800</pubDate><guid>https://plumephp.com/database-connection-pooling/</guid><description>&lt;h2 id="1-为什么需要连接池"&gt;1. 为什么需要连接池&lt;/h2&gt;
&lt;h3 id="11-数据库连接的代价"&gt;1.1 数据库连接的代价&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;创建一条数据库连接是&lt;strong&gt;昂贵&lt;/strong&gt;的操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TCP 三次握手（~1-3ms，跨可用区更长）&lt;/li&gt;
&lt;li&gt;TLS/SSL 握手（如有，~5-20ms）&lt;/li&gt;
&lt;li&gt;数据库认证（密码验证、权限查询）&lt;/li&gt;
&lt;li&gt;内存分配（数据库端为连接分配会话内存）&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;无连接池 vs 连接池：

无连接池：
 每次请求 ──→ 新建连接 ──→ 执行 SQL ──→ 关闭连接
 ↑ ↓
 └──── 每次 5-20ms ────┘

连接池：
 初始化：创建 10 条连接放入池中
 
 每次请求 ──→ 从池获取连接（&amp;lt; 1ms）──→ 执行 SQL ──→ 归还连接
 ↑ ↓
 └────────── 复用，无创建开销 ──────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="12-连接池核心收益"&gt;1.2 连接池核心收益&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;收益&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;降低延迟&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;避免每次请求建立连接的开销&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;资源控制&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;限制最大连接数，防止数据库过载&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;连接复用&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;减少数据库端会话资源消耗&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;稳定性&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;预热连接、健康检查保障可用性&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="2-连接池核心参数"&gt;2. 连接池核心参数&lt;/h2&gt;
&lt;h3 id="21-参数详解"&gt;2.1 参数详解&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;参数&lt;/th&gt;
					&lt;th&gt;作用&lt;/th&gt;
					&lt;th&gt;建议值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;minimumIdle&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;最小空闲连接数&lt;/td&gt;
					&lt;td&gt;5-10（保持热连接）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;maximumPoolSize&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;最大连接数&lt;/td&gt;
					&lt;td&gt;20-50（取决于 DB 配置）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;connectionTimeout&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;获取连接最大等待时间&lt;/td&gt;
					&lt;td&gt;30s&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;idleTimeout&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;空闲连接超时回收&lt;/td&gt;
					&lt;td&gt;10min&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;maxLifetime&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;连接最大存活时间&lt;/td&gt;
					&lt;td&gt;30min（短于 DB wait_timeout）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;keepaliveTime&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;保活检查间隔&lt;/td&gt;
					&lt;td&gt;5min&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="22-最大连接数设置"&gt;2.2 最大连接数设置&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;公式：连接池大小 = ((核心数 × 2) + 有效磁盘数)

更精确的计算：
 连接数 = (CPU 核心数 × 2) + 磁盘 spindle 数

示例（HikariCP 作者建议）：
 4 核服务器 → 约 10 个连接即可获得最大吞吐
 连接数再多，由于上下文切换和锁竞争，吞吐反而下降

生产环境经验：
 单机应用：10-20 连接
 微服务集群（10 实例 × 10 连接）：需 DB 支持 100+ 连接
 MySQL max_connections 默认 151，需按规模调整
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="3-主流连接池对比"&gt;3. 主流连接池对比&lt;/h2&gt;
&lt;h3 id="31-hikaricp推荐"&gt;3.1 HikariCP（推荐）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Fast, simple, reliable. Zero overhead.&amp;rdquo;&lt;/p&gt;</description></item><item><title>07. 查询优化与执行计划</title><link>https://plumephp.com/database-query-optimization/</link><pubDate>Fri, 14 Aug 2026 16:07:00 +0800</pubDate><guid>https://plumephp.com/database-query-optimization/</guid><description>&lt;h2 id="1-查询执行流程"&gt;1. 查询执行流程&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SQL 语句
 → 词法/语法分析 → 解析树（Parse Tree）
 → 语义检查（表/列存在性、权限）
 → 查询重写（视图展开、子查询优化、常量传播）
 → 生成候选执行计划
 → 代价估算（统计信息 + 代价模型）
 → 选择最优计划
 → 执行引擎执行
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="2-explain-详解"&gt;2. EXPLAIN 详解&lt;/h2&gt;
&lt;h3 id="21-explain-输出列"&gt;2.1 EXPLAIN 输出列&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ANALYZE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;departments&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dept_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emp_id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2024-01-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;列&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;关键值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;执行顺序编号&lt;/td&gt;
					&lt;td&gt;相同 id 从上到下执行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;select_type&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;查询类型&lt;/td&gt;
					&lt;td&gt;SIMPLE/PRI/ SUBQUERY/DERIVED&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;table&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;访问的表&lt;/td&gt;
					&lt;td&gt;别名/子查询&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;访问类型&lt;/td&gt;
					&lt;td&gt;** ALL &amp;lt; index &amp;lt; range &amp;lt; ref &amp;lt; eq_ref &amp;lt; const **&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;possible_keys&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;可能用的索引&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;key&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;实际用的索引&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;key_len&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;索引使用长度&lt;/td&gt;
					&lt;td&gt;越短越好（但需完整匹配）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ref&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;索引对比值&lt;/td&gt;
					&lt;td&gt;const/列名&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;rows&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;估算扫描行数&lt;/td&gt;
					&lt;td&gt;越小越好&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;filtered&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;过滤后剩余比例&lt;/td&gt;
					&lt;td&gt;越高越好&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Extra&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;额外信息&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Using index&lt;/strong&gt; 好，&lt;strong&gt;Using filesort&lt;/strong&gt; 差&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="22-type-列优化目标"&gt;2.2 type 列优化目标&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;type&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;system&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;系统表，仅一行&lt;/td&gt;
					&lt;td&gt;极罕见&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;const&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;主键/唯一索引等值&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;WHERE id = 1&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;eq_ref&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;JOIN 主键/唯一索引&lt;/td&gt;
					&lt;td&gt;JOIN 条件为主键&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ref&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;普通索引等值&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;WHERE status = 'active'&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;range&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;索引范围&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;WHERE id BETWEEN 1 AND 100&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;index&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;全索引扫描&lt;/td&gt;
					&lt;td&gt;索引覆盖 SELECT 列&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ALL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;全表扫描&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;无索引或索引未命中&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;优化目标：&lt;strong&gt;至少要达到 range，最好是 ref 或 eq_ref&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>06. 锁机制与死锁处理</title><link>https://plumephp.com/database-locking/</link><pubDate>Fri, 14 Aug 2026 16:06:00 +0800</pubDate><guid>https://plumephp.com/database-locking/</guid><description>&lt;h2 id="1-锁粒度"&gt;1. 锁粒度&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;锁类型&lt;/th&gt;
					&lt;th&gt;粒度&lt;/th&gt;
					&lt;th&gt;并发度&lt;/th&gt;
					&lt;th&gt;开销&lt;/th&gt;
					&lt;th&gt;代表&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;表锁&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;整张表&lt;/td&gt;
					&lt;td&gt;最低&lt;/td&gt;
					&lt;td&gt;最低&lt;/td&gt;
					&lt;td&gt;MyISAM&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;页锁&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;一页（通常 4KB/8KB）&lt;/td&gt;
					&lt;td&gt;中等&lt;/td&gt;
					&lt;td&gt;中等&lt;/td&gt;
					&lt;td&gt;BDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;行锁&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;单行记录&lt;/td&gt;
					&lt;td&gt;最高&lt;/td&gt;
					&lt;td&gt;最高&lt;/td&gt;
					&lt;td&gt;InnoDB&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;InnoDB 默认使用&lt;strong&gt;行锁&lt;/strong&gt;，但在特定场景下会退化为表锁（如未命中索引的全表扫描）。&lt;/p&gt;</description></item><item><title>05. MVCC 多版本并发控制</title><link>https://plumephp.com/database-mvcc/</link><pubDate>Fri, 14 Aug 2026 16:05:00 +0800</pubDate><guid>https://plumephp.com/database-mvcc/</guid><description>&lt;h2 id="1-mvcc-核心思想"&gt;1. MVCC 核心思想&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;MVCC（Multi-Version Concurrency Control）&lt;/strong&gt; 通过保存数据的多个历史版本，实现 &lt;strong&gt;读不阻塞写、写不阻塞读&lt;/strong&gt;，避免加锁带来的并发性能损失。&lt;/p&gt;</description></item><item><title>04. 事务 ACID 与隔离级别</title><link>https://plumephp.com/database-transactions-acid/</link><pubDate>Fri, 14 Aug 2026 16:04:00 +0800</pubDate><guid>https://plumephp.com/database-transactions-acid/</guid><description>&lt;h2 id="1-acid-属性"&gt;1. ACID 属性&lt;/h2&gt;
&lt;h3 id="11-四大特性"&gt;1.1 四大特性&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;属性&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
					&lt;th&gt;InnoDB 实现机制&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;tomicity（原子性）&lt;/td&gt;
					&lt;td&gt;事务要么全完成，要么全不完成&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Undo Log&lt;/strong&gt;（回滚日志）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;C&lt;/strong&gt;onsistency（一致性）&lt;/td&gt;
					&lt;td&gt;事务前后数据库处于一致状态&lt;/td&gt;
					&lt;td&gt;约束、触发器、外键、业务规则&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;I&lt;/strong&gt;solation（隔离性）&lt;/td&gt;
					&lt;td&gt;并发事务互不干扰&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;MVCC + 锁&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;D&lt;/strong&gt;urability（持久性）&lt;/td&gt;
					&lt;td&gt;事务提交后数据永久保存&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Redo Log + WAL&lt;/strong&gt;（预写日志）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-innodb-的事务日志"&gt;1.2 InnoDB 的事务日志&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Undo Log（回滚日志）：
 - 记录数据修改前的旧值
 - 事务回滚时，用 Undo Log 恢复数据
 - 作用：原子性 + MVCC 版本链

Redo Log（重做日志）：
 - 记录数据修改后的新值
 - 事务提交时，先写 Redo Log，再刷脏页
 - 作用：持久性（崩溃恢复）

Write-Ahead Logging (WAL)：
 - 先写日志，再写磁盘
 - 日志顺序写（快） vs 数据页随机写（慢）
 - Redo Log 顺序写提高性能，同时保证不丢数据
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="2-四种隔离级别"&gt;2. 四种隔离级别&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;SQL 标准定义了四种隔离级别，从低到高限制越来越严格，但并发性能逐渐降低。&lt;/p&gt;</description></item><item><title>03. B+ 树索引原理</title><link>https://plumephp.com/database-btree-index/</link><pubDate>Fri, 14 Aug 2026 16:03:00 +0800</pubDate><guid>https://plumephp.com/database-btree-index/</guid><description>&lt;h2 id="1-为什么需要-b-树"&gt;1. 为什么需要 B+ 树&lt;/h2&gt;
&lt;h3 id="11-磁盘-io-问题"&gt;1.1 磁盘 I/O 问题&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;数据库的数据存储在磁盘上，磁盘 I/O 是性能瓶颈。&lt;strong&gt;B+ 树的设计目标是减少磁盘 I/O 次数&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;磁盘读取特点：
- 顺序读：快（磁盘预读）
- 随机读：慢（磁头寻道时间 ~ 10ms）
- 最小读取单位：页（Page，通常 4KB/8KB/16KB）

B+ 树通过让树尽可能&amp;#34;矮胖&amp;#34;，减少随机 I/O：
 树高 3 → 最多 2 次随机 I/O（根→叶子）
 树高 4 → 最多 3 次随机 I/O
 
对于 2000 万行数据（InnoDB，16KB 页）：
 每页存储约 1170 个 key（假设 key 为 8B + 指针 6B）
 树高 3 可存储：1170 × 1170 × 16 ≈ 2190 万行
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="12-b-tree-vs-btree"&gt;1.2 B-Tree vs B+Tree&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;B-Tree：
 [10, 20]
 / | \
 [5,8] [15,18] [25,30]
 数据存储在所有节点（内部节点也存数据）
 问题：内部节点大，树变高

B+Tree（数据库标准）：
 [10, 20] ← 内部节点：只存 key 用于导航
 / | \
 [5,8] [15,18] [25,30] → 叶子节点：存 key + 数据，且叶子间有链表
 叶子节点通过链表连接，范围查询高效
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;B-Tree&lt;/th&gt;
					&lt;th&gt;B+Tree&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;数据存储&lt;/td&gt;
					&lt;td&gt;所有节点&lt;/td&gt;
					&lt;td&gt;仅叶子节点&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;叶子链表&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;有（范围查询友好）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;树高&lt;/td&gt;
					&lt;td&gt;较高&lt;/td&gt;
					&lt;td&gt;更矮&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;全表扫描&lt;/td&gt;
					&lt;td&gt;遍历整棵树&lt;/td&gt;
					&lt;td&gt;仅遍历叶子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;空间利用率&lt;/td&gt;
					&lt;td&gt;较低&lt;/td&gt;
					&lt;td&gt;更高&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="2-innodb-索引结构"&gt;2. InnoDB 索引结构&lt;/h2&gt;
&lt;h3 id="21-聚簇索引clustered-index"&gt;2.1 聚簇索引（Clustered Index）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;聚簇索引就是表本身&lt;/strong&gt;。数据行按主键顺序存储在 B+ 树的叶子节点中。&lt;/p&gt;</description></item><item><title>02. 关系模型与 SQL 基础</title><link>https://plumephp.com/database-relational-model/</link><pubDate>Fri, 14 Aug 2026 16:02:00 +0800</pubDate><guid>https://plumephp.com/database-relational-model/</guid><description>&lt;h2 id="1-关系代数"&gt;1. 关系代数&lt;/h2&gt;
&lt;p&gt;关系数据库基于关系代数，核心操作：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;操作&lt;/th&gt;
					&lt;th&gt;SQL 对应&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;σ (选择)&lt;/td&gt;
					&lt;td&gt;WHERE&lt;/td&gt;
					&lt;td&gt;按条件过滤行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;π (投影)&lt;/td&gt;
					&lt;td&gt;SELECT&lt;/td&gt;
					&lt;td&gt;选择列&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;⋈ (连接)&lt;/td&gt;
					&lt;td&gt;JOIN&lt;/td&gt;
					&lt;td&gt;表关联&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;∪ (并)&lt;/td&gt;
					&lt;td&gt;UNION&lt;/td&gt;
					&lt;td&gt;合并结果集&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;− (差)&lt;/td&gt;
					&lt;td&gt;EXCEPT&lt;/td&gt;
					&lt;td&gt;差集&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ρ (重命名)&lt;/td&gt;
					&lt;td&gt;AS&lt;/td&gt;
					&lt;td&gt;别名&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="2-sql-核心语法"&gt;2. SQL 核心语法&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 条件聚合
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;total_employees&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;THEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;high_earners&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FILTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;active&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;avg_salary&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;HAVING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 窗口函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RANK&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PARTITION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dept_rank&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PARTITION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;diff_from_avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hire_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;running_total&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- CTE 递归查询（组织架构）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;RECURSIVE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;org_tree&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;manager_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;level&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;manager_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UNION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ALL&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;org_tree&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;org_tree&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="延伸阅读"&gt;延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://plumephp.com/database-btree-index/"&gt;B+ 树索引原理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>01. 数据库系统概述与分类</title><link>https://plumephp.com/database-overview/</link><pubDate>Fri, 14 Aug 2026 16:01:00 +0800</pubDate><guid>https://plumephp.com/database-overview/</guid><description>&lt;h2 id="1-数据库分类全景"&gt;1. 数据库分类全景&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;数据库系统
 ├── 关系型数据库 (RDBMS)
 │ ├── 商业：Oracle、SQL Server、DB2
 │ ├── 开源：PostgreSQL、MySQL、MariaDB
 │ └── 特点：ACID、SQL、强一致性、成熟生态
 │
 ├── NoSQL 数据库
 │ ├── 文档型：MongoDB、CouchDB、Firestore
 │ ├── 键值型：Redis、DynamoDB、Riak
 │ ├── 列族型：Cassandra、HBase、ScyllaDB
 │ ├── 图数据库：Neo4j、Dgraph、JanusGraph
 │ └── 搜索引擎：Elasticsearch、OpenSearch
 │
 ├── NewSQL 数据库
 │ ├── Google Spanner、CockroachDB、TiDB、YugabyteDB
 │ └── 特点：水平扩展 + ACID + SQL 兼容
 │
 └── 专用数据库
 ├── 时序数据库：InfluxDB、TimescaleDB、TDengine
 ├── 向量数据库：Pinecone、Milvus、pgvector
 └── 内存数据库：Redis、SAP HANA、MemSQL
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="2-oltp-vs-olap"&gt;2. OLTP vs OLAP&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;OLTP（在线事务处理）&lt;/th&gt;
					&lt;th&gt;OLAP（在线分析处理）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;用途&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;日常业务操作&lt;/td&gt;
					&lt;td&gt;数据分析、报表、决策支持&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;数据规模&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;GB ~ TB&lt;/td&gt;
					&lt;td&gt;TB ~ PB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;查询模式&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;点查、短事务、少量行&lt;/td&gt;
					&lt;td&gt;全表扫描、聚合、多表 JOIN&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;写入&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;高并发随机写入&lt;/td&gt;
					&lt;td&gt;批量导入、ETL&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;更新&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;频繁 UPDATE/DELETE&lt;/td&gt;
					&lt;td&gt;mostly 追加（Append-only）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;响应时间&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;毫秒级&lt;/td&gt;
					&lt;td&gt;秒 ~ 分钟级&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;代表&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;MySQL、PostgreSQL、Oracle&lt;/td&gt;
					&lt;td&gt;ClickHouse、Snowflake、BigQuery&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="3-nosql-选型指南"&gt;3. NoSQL 选型指南&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;类型&lt;/th&gt;
					&lt;th&gt;数据模型&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
					&lt;th&gt;代表产品&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;文档型&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;JSON/BSON 文档&lt;/td&gt;
					&lt;td&gt;内容管理、用户资料、 catalogs&lt;/td&gt;
					&lt;td&gt;MongoDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;键值型&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;key-value&lt;/td&gt;
					&lt;td&gt;缓存、会话、购物车&lt;/td&gt;
					&lt;td&gt;Redis、DynamoDB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;列族型&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;宽列存储&lt;/td&gt;
					&lt;td&gt;时序数据、日志、IoT&lt;/td&gt;
					&lt;td&gt;Cassandra&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;图数据库&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;节点 + 边&lt;/td&gt;
					&lt;td&gt;社交网络、知识图谱、推荐&lt;/td&gt;
					&lt;td&gt;Neo4j&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;搜索引擎&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;倒排索引&lt;/td&gt;
					&lt;td&gt;全文检索、日志分析&lt;/td&gt;
					&lt;td&gt;Elasticsearch&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="4-选型决策树"&gt;4. 选型决策树&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;需要水平扩展？
 ├── 是 → 需要 ACID 事务？
 │ ├── 是 → NewSQL (TiDB/CockroachDB/Spanner)
 │ └── 否 → NoSQL
 │ ├── 键值查询为主 → Redis/DynamoDB
 │ ├── 文档模型 → MongoDB
 │ ├── 时序数据 → InfluxDB/TimescaleDB
 │ └── 图关系 → Neo4j
 └── 否 → 复杂分析查询为主？
 ├── 是 → ClickHouse/DuckDB/Snowflake
 └── 否 → PostgreSQL / MySQL
 ├── 需要高级功能（JSON/全文/GIS）→ PostgreSQL
 └── 追求简单、广泛兼容 → MySQL
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt; 被称为&amp;quot;世界上最先进的开源关系型数据库&amp;quot;，功能丰富（JSONB、数组、范围类型、全文检索、GIS 扩展），适合作为大多数应用的首选数据库。&lt;/p&gt;</description></item><item><title>备份恢复与高可用方案</title><link>https://plumephp.com/database-backup-recovery/</link><pubDate>Thu, 13 Aug 2026 11:35:00 +0800</pubDate><guid>https://plumephp.com/database-backup-recovery/</guid><description>&lt;p&gt;数据是企业最核心的资产。完善的备份恢复策略与高可用架构是保障数据安全、业务连续性的底线工程。本文系统讲解 MySQL 备份恢复方案与高可用架构选型。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-备份策略设计"&gt;1. 备份策略设计&lt;/h2&gt;
&lt;h3 id="11-备份维度"&gt;1.1 备份维度&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;策略&lt;/th&gt;
					&lt;th&gt;RPO&lt;/th&gt;
					&lt;th&gt;RTO&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;全量备份&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;每周/每日全备&lt;/td&gt;
					&lt;td&gt;24h&lt;/td&gt;
					&lt;td&gt;小时级&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;增量备份&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;XtraBackup 增量 + Binlog&lt;/td&gt;
					&lt;td&gt;小时级&lt;/td&gt;
					&lt;td&gt;分钟级&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;实时复制&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;主从同步 + Binlog&lt;/td&gt;
					&lt;td&gt;秒级&lt;/td&gt;
					&lt;td&gt;秒级&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;跨地域备份&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;异地机房/云存储&lt;/td&gt;
					&lt;td&gt;取决于同步&lt;/td&gt;
					&lt;td&gt;分钟级&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-321-备份原则"&gt;1.2 321 备份原则&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;3 份数据副本
2 种不同存储介质
1 份异地备份
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="2-物理备份percona-xtrabackup"&gt;2. 物理备份：Percona XtraBackup&lt;/h2&gt;
&lt;h3 id="21-特点"&gt;2.1 特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;热备份：不锁表或只锁很短时间&lt;/li&gt;
&lt;li&gt;支持增量备份&lt;/li&gt;
&lt;li&gt;支持流式压缩备份&lt;/li&gt;
&lt;li&gt;支持并行备份&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="22-全量备份"&gt;2.2 全量备份&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 全量备份&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xtrabackup --backup --target-dir&lt;span class="o"&gt;=&lt;/span&gt;/backup/full/&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --user&lt;span class="o"&gt;=&lt;/span&gt;backup --password&lt;span class="o"&gt;=&lt;/span&gt;xxx --host&lt;span class="o"&gt;=&lt;/span&gt;localhost
&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 class="c1"&gt;# 备份过程：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 拷贝 InnoDB 数据文件（不锁表）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 执行 FLUSH TABLES WITH READ LOCK（FTWRL）复制非 InnoDB 文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 记录 Binlog 位点（用于恢复时点）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. 解锁&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="23-增量备份"&gt;2.3 增量备份&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 周日全量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xtrabackup --backup --target-dir&lt;span class="o"&gt;=&lt;/span&gt;/backup/full
&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 class="c1"&gt;# 周一增量（基于周日全量）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xtrabackup --backup --target-dir&lt;span class="o"&gt;=&lt;/span&gt;/backup/inc1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --incremental-basedir&lt;span class="o"&gt;=&lt;/span&gt;/backup/full
&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 class="c1"&gt;# 周二增量（基于周一增量）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xtrabackup --backup --target-dir&lt;span class="o"&gt;=&lt;/span&gt;/backup/inc2 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --incremental-basedir&lt;span class="o"&gt;=&lt;/span&gt;/backup/inc1
&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 class="c1"&gt;# 恢复：准备（apply log）→ 合并 → 恢复&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xtrabackup --prepare --apply-log-only --target-dir&lt;span class="o"&gt;=&lt;/span&gt;/backup/full
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xtrabackup --prepare --apply-log-only --target-dir&lt;span class="o"&gt;=&lt;/span&gt;/backup/full &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --incremental-dir&lt;span class="o"&gt;=&lt;/span&gt;/backup/inc1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xtrabackup --prepare --target-dir&lt;span class="o"&gt;=&lt;/span&gt;/backup/full &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --incremental-dir&lt;span class="o"&gt;=&lt;/span&gt;/backup/inc2
&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 class="c1"&gt;# 拷贝恢复&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xtrabackup --copy-back --target-dir&lt;span class="o"&gt;=&lt;/span&gt;/backup/full &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --datadir&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/mysql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="24-流式备份到远程"&gt;2.4 流式备份到远程&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 压缩流式备份到远程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xtrabackup --backup --stream&lt;span class="o"&gt;=&lt;/span&gt;xbstream --compress &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ssh backup-server &lt;span class="s2"&gt;&amp;#34;xbstream -x -C /backup/&amp;#34;&lt;/span&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 class="c1"&gt;# 或使用 nc/socat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="3-逻辑备份mysqldump--mydumper"&gt;3. 逻辑备份：mysqldump / mydumper&lt;/h2&gt;
&lt;h3 id="31-mysqldump"&gt;3.1 mysqldump&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 全库逻辑备份（单线程，适合小库）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysqldump -u root -p --all-databases --single-transaction &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --routines --triggers --events &amp;gt; full_backup.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;&lt;span class="c1"&gt;# 关键参数：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --single-transaction: 开启事务一致性备份（InnoDB）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --master-data=2: 记录 Binlog 位点到注释&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --quick: 不缓存全表到内存（大表必选）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --where: 条件备份&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-mydumper多线程逻辑备份"&gt;3.2 mydumper（多线程逻辑备份）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 多线程备份（推荐大库）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mydumper -u root -p xxx -B mydb -t &lt;span class="m"&gt;4&lt;/span&gt; -o /backup/mydumper/
&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 class="c1"&gt;# -t 4: 4 个线程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出：每个表一个文件 + metadata（Binlog 位点）&lt;/span&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 class="c1"&gt;# 恢复&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;myloader -u root -p xxx -d /backup/mydumper/ -t &lt;span class="m"&gt;4&lt;/span&gt; -B mydb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="33-物理-vs-逻辑备份对比"&gt;3.3 物理 vs 逻辑备份对比&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;物理备份（XtraBackup）&lt;/th&gt;
					&lt;th&gt;逻辑备份（mysqldump）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;速度&lt;/td&gt;
					&lt;td&gt;快（文件拷贝）&lt;/td&gt;
					&lt;td&gt;慢（逐行导出）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;大小&lt;/td&gt;
					&lt;td&gt;紧凑（数据文件）&lt;/td&gt;
					&lt;td&gt;较大（文本+INSERT）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;恢复速度&lt;/td&gt;
					&lt;td&gt;极快&lt;/td&gt;
					&lt;td&gt;慢&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;跨版本&lt;/td&gt;
					&lt;td&gt;有限制&lt;/td&gt;
					&lt;td&gt;兼容性好&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;部分恢复&lt;/td&gt;
					&lt;td&gt;难&lt;/td&gt;
					&lt;td&gt;容易（单表恢复）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;增量备份&lt;/td&gt;
					&lt;td&gt;支持&lt;/td&gt;
					&lt;td&gt;不支持&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;适用&lt;/td&gt;
					&lt;td&gt;大库、生产环境&lt;/td&gt;
					&lt;td&gt;小库、数据迁移&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="4-基于-binlog-的-pitr时间点恢复"&gt;4. 基于 Binlog 的 PITR（时间点恢复）&lt;/h2&gt;
&lt;h3 id="41-原理"&gt;4.1 原理&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;全量备份（周日 00:00）
 │
 ▼
恢复全量 ──► 应用增量（周一、周二）
 │
 ▼
 应用 Binlog（精确到秒）
 │
 ▼
 恢复到&amp;#34;误删前 1 秒&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="42-恢复步骤"&gt;4.2 恢复步骤&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 恢复全量 + 增量（见上节）&lt;/span&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 class="c1"&gt;# 2. 查找目标 Binlog 文件和位点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysqlbinlog /var/lib/mysql/binlog.000042 &lt;span class="p"&gt;|&lt;/span&gt; grep -i &lt;span class="s2"&gt;&amp;#34;DROP TABLE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 找到误操作的位点：2024-01-15 14:30:25&lt;/span&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 class="c1"&gt;# 3. 应用 Binlog 到目标位点前&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysqlbinlog --start-position&lt;span class="o"&gt;=&lt;/span&gt;xxx --stop-datetime&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2024-01-15 14:30:24&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /var/lib/mysql/binlog.000042 /var/lib/mysql/binlog.000043 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; mysql -u root -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="43-延迟从库预防误操作最佳实践"&gt;4.3 延迟从库（预防误操作最佳实践）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置延迟从库（延迟 1 小时）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[mysqld]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;replica_parallel_workers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;4&lt;/span&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 class="na"&gt;CHANGE REPLICATION SOURCE TO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;SOURCE_DELAY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;3600; -- 延迟 3600 秒&lt;/span&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 class="c1"&gt;# 误操作后可快速从延迟从库恢复&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="5-高可用架构方案"&gt;5. 高可用架构方案&lt;/h2&gt;
&lt;h3 id="51-主从复制基础"&gt;5.1 主从复制（基础）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Master ──► Binlog ──► Slave
 │ │
 │ └── 只读查询、备份
 └── 写请求

复制模式：
- 异步复制：Master 不等待 Slave 确认（默认，可能丢数据）
- 半同步复制：Master 等至少一个 Slave ACK（减少丢数据风险）
- 组复制：Multi-Master（MySQL 8.0 Group Replication）
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="52-mhamaster-high-availability"&gt;5.2 MHA（Master High Availability）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;架构：
Manager 节点（监控+决策）
 │
 ├── Master (写)
 ├── Slave1 (候选新主)
 └── Slave2 (从)

故障检测：Manager 定期 ping 所有节点
故障转移：
 1. 检测到 Master 不可达
 2. 从 Slaves 中选举最新数据的节点
 3. 应用差异 Binlog（relay log）
 4. 提升为新的 Master
 5. 其他 Slaves 重新指向新 Master
 
切换时间：通常 10-30 秒

局限：Manager 单点、需要 SSH 免密、只支持一主多从
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="53-orchestrator推荐"&gt;5.3 Orchestrator（推荐）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;优势（相比 MHA）：
1. 可视化拓扑管理（Web UI）
2. 支持 GTID 和普通复制
3. 可以处理复杂拓扑（级联复制）
4. sophisticated 故障检测（避免网络抖动误判）
5. 手工/自动故障转移都支持
6. 支持 Pre-failover hooks（自定义逻辑）

部署：
docker run -d --name orchestrator \
 -p 3000:3000 \
 openarkcode/orchestrator

关键配置：
&amp;#34;RecoveryMasterPromotionIgnoreHostnameFilters&amp;#34;: [],
&amp;#34;RecoverMasterClusterFilters&amp;#34;: [&amp;#34;.*&amp;#34;],
&amp;#34;RecoveryPeriodBlockSeconds&amp;#34;: 3600 # 故障恢复后禁止再次切换的时间
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="54-mysql-group-replicationmgr"&gt;5.4 MySQL Group Replication（MGR）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;原生高可用（MySQL 5.7+）：

Primary-Secondary 模式：
 Primary: 读写
 Secondary × N: 只读（自动复制）
 
 Primary 故障 → 自动选举新 Primary（基于 Paxos 算法）

Multi-Primary 模式：
 多个节点都可读写
 冲突检测：Certification-based
 局限：不支持 SERIALIZABLE、外键需小心

配置要点：
group_replication_group_name = &amp;#34;aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee&amp;#34;
group_replication_local_address = &amp;#34;node1:33061&amp;#34;
group_replication_group_seeds = &amp;#34;node1:33061,node2:33061,node3:33061&amp;#34;
group_replication_single_primary_mode = ON
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="55-方案对比"&gt;5.5 方案对比&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方案&lt;/th&gt;
					&lt;th&gt;自动故障转移&lt;/th&gt;
					&lt;th&gt;数据一致性&lt;/th&gt;
					&lt;th&gt;复杂度&lt;/th&gt;
					&lt;th&gt;适用&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;主从手动&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;❌&lt;/td&gt;
					&lt;td&gt;异步&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
					&lt;td&gt;非核心系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;MHA&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;半同步可选&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;中大型系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Orchestrator&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;配置灵活&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;推荐方案&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;MGR&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;强一致（多数派）&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;MySQL 8.0+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;MySQL Router&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;取决于后端&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
					&lt;td&gt;配合 MGR&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;ProxySQL&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;✅&lt;/td&gt;
					&lt;td&gt;配置灵活&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;读写分离 + 故障转移&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="6-读写分离架构"&gt;6. 读写分离架构&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; ┌──► Read Replica 1
App ──► ProxySQL ├──► Read Replica 2
 │ (读负载均衡)
 └──► Master (写)
 
ProxySQL 规则：
- SELECT ... FOR UPDATE → Master
- SELECT * FROM ... → Replica
- INSERT/UPDATE/DELETE → Master
- 自定义规则（按用户、Schema、查询 pattern）
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="7-灾难恢复演练"&gt;7. 灾难恢复演练&lt;/h2&gt;
&lt;h3 id="71-定期演练计划"&gt;7.1 定期演练计划&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;演练类型&lt;/th&gt;
					&lt;th&gt;频率&lt;/th&gt;
					&lt;th&gt;内容&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;全量恢复&lt;/td&gt;
					&lt;td&gt;每季度&lt;/td&gt;
					&lt;td&gt;从备份恢复到测试环境，验证可用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;PITR 恢复&lt;/td&gt;
					&lt;td&gt;每半年&lt;/td&gt;
					&lt;td&gt;恢复到指定时间点，验证精度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;故障切换&lt;/td&gt;
					&lt;td&gt;每月&lt;/td&gt;
					&lt;td&gt;模拟主库宕机，验证自动切换&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;跨区域恢复&lt;/td&gt;
					&lt;td&gt;每年&lt;/td&gt;
					&lt;td&gt;从异地备份恢复完整环境&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="72-恢复时间目标"&gt;7.2 恢复时间目标&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;分级&lt;/th&gt;
					&lt;th&gt;RTO&lt;/th&gt;
					&lt;th&gt;RPO&lt;/th&gt;
					&lt;th&gt;方案&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;核心业务&lt;/td&gt;
					&lt;td&gt;&amp;lt; 5min&lt;/td&gt;
					&lt;td&gt;&amp;lt; 1min&lt;/td&gt;
					&lt;td&gt;MGR + 异地热备&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;重要业务&lt;/td&gt;
					&lt;td&gt;&amp;lt; 30min&lt;/td&gt;
					&lt;td&gt;&amp;lt; 1h&lt;/td&gt;
					&lt;td&gt;MHA/Orchestrator + Binlog&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;一般业务&lt;/td&gt;
					&lt;td&gt;&amp;lt; 4h&lt;/td&gt;
					&lt;td&gt;&amp;lt; 24h&lt;/td&gt;
					&lt;td&gt;定时备份 + 手动恢复&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="8-总结"&gt;8. 总结&lt;/h2&gt;
&lt;p&gt;数据库备份与高可用是系统工程：&lt;/p&gt;</description></item><item><title>数据库性能监控与诊断</title><link>https://plumephp.com/database-performance-monitoring/</link><pubDate>Thu, 13 Aug 2026 11:30:00 +0800</pubDate><guid>https://plumephp.com/database-performance-monitoring/</guid><description>&lt;p&gt;数据库是系统核心组件，其性能直接影响用户体验。建立完善的监控与诊断体系，是 DBA 和 SRE 的核心能力。本文系统讲解 MySQL 性能监控的完整工具链与实践方法。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-监控指标体系"&gt;1. 监控指标体系&lt;/h2&gt;
&lt;h3 id="11-黄金指标google-sre-方法论"&gt;1.1 黄金指标（Google SRE 方法论）&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;指标类型&lt;/th&gt;
					&lt;th&gt;具体指标&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;流量&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;QPS/TPS、连接数、Threads_connected&lt;/td&gt;
					&lt;td&gt;系统负载&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;延迟&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;查询耗时 P50/P95/P99、慢查询率&lt;/td&gt;
					&lt;td&gt;响应速度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;错误&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;错误查询数、死锁数、锁等待超时&lt;/td&gt;
					&lt;td&gt;失败比例&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;饱和度&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;CPU、内存、磁盘 IO、Buffer Pool 命中率&lt;/td&gt;
					&lt;td&gt;资源瓶颈&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-关键公式"&gt;1.2 关键公式&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;QPS = Queries / Uptime
TPS = (Com_commit + Com_rollback) / Uptime

Buffer Pool 命中率 = 1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)
 值 &amp;gt; 95% 为健康

慢查询占比 = Slow_queries / Queries × 100%
 应 &amp;lt; 1%，否则需要优化
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="2-performance-schema"&gt;2. Performance Schema&lt;/h2&gt;
&lt;p&gt;MySQL 5.5+ 内置的性能监控框架，低开销采集运行时数据。&lt;/p&gt;</description></item><item><title>NewSQL 选型对比</title><link>https://plumephp.com/database-newsql-comparison/</link><pubDate>Thu, 13 Aug 2026 11:25:00 +0800</pubDate><guid>https://plumephp.com/database-newsql-comparison/</guid><description>&lt;p&gt;NewSQL 是一类兼顾关系型数据库的 ACID 事务与 NoSQL 水平扩展能力的分布式数据库。随着 TiDB、CockroachDB 等系统的成熟，NewSQL 正从理论走向大规模生产。本文对比主流 NewSQL 数据库，帮助团队做出合理选型。&lt;/p&gt;</description></item><item><title>Redis 高级实战</title><link>https://plumephp.com/database-redis-advanced/</link><pubDate>Thu, 13 Aug 2026 11:20:00 +0800</pubDate><guid>https://plumephp.com/database-redis-advanced/</guid><description>&lt;p&gt;Redis 不仅是缓存，更是高性能数据结构服务。从单机到集群、从基础数据结构到企业级治理，本文深入 Redis 高级特性与生产实践。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-redis-数据结构原理"&gt;1. Redis 数据结构原理&lt;/h2&gt;
&lt;h3 id="11-底层实现速查"&gt;1.1 底层实现速查&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;用户类型&lt;/th&gt;
					&lt;th&gt;编码方式&lt;/th&gt;
					&lt;th&gt;场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;String&lt;/td&gt;
					&lt;td&gt;SDS / int / embstr&lt;/td&gt;
					&lt;td&gt;缓存、计数器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;List&lt;/td&gt;
					&lt;td&gt;quicklist（3.2+）&lt;/td&gt;
					&lt;td&gt;队列、时间线&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Hash&lt;/td&gt;
					&lt;td&gt;ziplist / hashtable&lt;/td&gt;
					&lt;td&gt;对象存储&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Set&lt;/td&gt;
					&lt;td&gt;intset / hashtable&lt;/td&gt;
					&lt;td&gt;标签、去重&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ZSet&lt;/td&gt;
					&lt;td&gt;ziplist / skiplist+hashtable&lt;/td&gt;
					&lt;td&gt;排行榜、延迟队列&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Stream&lt;/td&gt;
					&lt;td&gt;radix tree&lt;/td&gt;
					&lt;td&gt;消息队列&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Bitmap / Bitfield&lt;/td&gt;
					&lt;td&gt;raw string&lt;/td&gt;
					&lt;td&gt;签到、统计&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HyperLogLog&lt;/td&gt;
					&lt;td&gt;稀疏/稠密编码&lt;/td&gt;
					&lt;td&gt;UV 统计&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GEO&lt;/td&gt;
					&lt;td&gt;zset + geohash&lt;/td&gt;
					&lt;td&gt;位置服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BloomFilter&lt;/td&gt;
					&lt;td&gt;RedisBloom 模块&lt;/td&gt;
					&lt;td&gt;去重判断&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-跳表skip-listzset-的秘密"&gt;1.2 跳表（Skip List）：ZSet 的秘密&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ZSet 同时维护跳表 + 哈希表：

Hash: { member → score } O(1) 查找 score
Skip List: 按 score 排序的分层链表 O(log n) 范围查询

跳表示例（ZSet 的 skiplist）：

Level 3: head ───────────────────────► 100
Level 2: head ───────────► 30 ───────► 100
Level 1: head ──► 10 ──► 30 ──► 50 ──► 100
Level 0: head ─► 10 ─► 20 ─► 30 ─► 50 ─► 100
 ▼
 有序遍历
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;跳表相比平衡树：实现简单、范围查询高效、并发修改更容易。&lt;/p&gt;</description></item><item><title>TiDB 架构深度解析</title><link>https://plumephp.com/database-tidb-architecture/</link><pubDate>Thu, 13 Aug 2026 11:15:00 +0800</pubDate><guid>https://plumephp.com/database-tidb-architecture/</guid><description>&lt;p&gt;TiDB 是 PingCAP 开源的分布式 NewSQL 数据库，兼容 MySQL 协议，具备水平扩展、强一致性、高可用等特性。其架构深受 Google Spanner/F1 启发，融分布式存储、调度、计算于一体。本文深入解析 TiDB 各核心组件的设计原理。&lt;/p&gt;</description></item><item><title>HTAP 与 OLTP/OLAP 融合</title><link>https://plumephp.com/database-oltp-olap-convergence/</link><pubDate>Thu, 13 Aug 2026 11:10:00 +0800</pubDate><guid>https://plumephp.com/database-oltp-olap-convergence/</guid><description>&lt;p&gt;传统数据库架构将在线事务处理（OLTP）和分析处理（OLAP）分离：核心业务数据存储于 MySQL/PostgreSQL 等行存数据库，批量导入数据仓库进行报表分析。这种架构存在数据延迟、架构复杂等问题。HTAP（Hybrid Transactional/Analytical Processing）旨在用一套系统同时高效处理两种负载。本文从存储引擎原理到工程实践全面解析 HTAP。&lt;/p&gt;</description></item><item><title>分布式事务（2PC/3PC/TCC/Saga）</title><link>https://plumephp.com/database-distributed-transaction/</link><pubDate>Thu, 13 Aug 2026 11:05:00 +0800</pubDate><guid>https://plumephp.com/database-distributed-transaction/</guid><description>&lt;p&gt;单体数据库的事务通过 ACID 保证，但当数据分布在多个数据库或服务中时，如何保证跨节点的事务一致性？分布式事务是微服务架构和分库分表场景下的核心挑战。本文全面解析主流分布式事务协议和工程实践。&lt;/p&gt;</description></item><item><title>分库分表实战</title><link>https://plumephp.com/database-sharding-partitioning/</link><pubDate>Thu, 13 Aug 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/database-sharding-partitioning/</guid><description>&lt;p&gt;当单库数据量超过千万级、QPS 超过数千时，单节点数据库会成为系统瓶颈。分库分表（Sharding）是解决单机数据库性能与容量限制的核心方案。本文系统讲解拆分策略、分片键设计、中间件选型和扩容迁移方案。&lt;/p&gt;</description></item><item><title>索引设计与 B+ 树原理</title><link>https://plumephp.com/database-index-btree-hash/</link><pubDate>Thu, 13 Aug 2026 10:50:00 +0800</pubDate><guid>https://plumephp.com/database-index-btree-hash/</guid><description>&lt;p&gt;索引是数据库性能优化的基石，而 InnoDB 使用 &lt;strong&gt;B+ 树&lt;/strong&gt;作为核心索引结构。本文从底层原理出发，解析 B+ 树的结构设计、聚簇索引与二级索引的差异、哈希索引的应用场景，以及实际开发中的高级索引优化策略。&lt;/p&gt;</description></item><item><title>MVCC 多版本并发控制</title><link>https://plumephp.com/database-mvcc-concurrency/</link><pubDate>Thu, 13 Aug 2026 10:45:00 +0800</pubDate><guid>https://plumephp.com/database-mvcc-concurrency/</guid><description>&lt;p&gt;MVCC（Multi-Version Concurrency Control，多版本并发控制）是 InnoDB 实现高并发读写不阻塞的核心机制。通过为每行数据维护多个版本，SELECT 读取不需加锁即可获取一致性快照，大幅提高并发性能。本文深入解析 MVCC 的底层实现。&lt;/p&gt;</description></item><item><title>事务与 ACID 原理</title><link>https://plumephp.com/database-transaction-acid/</link><pubDate>Thu, 13 Aug 2026 10:40:00 +0800</pubDate><guid>https://plumephp.com/database-transaction-acid/</guid><description>&lt;p&gt;事务（Transaction）是数据库管理系统执行过程中的一个逻辑单位，由一个或多个 SQL 语句组成。事务的 &lt;strong&gt;ACID&lt;/strong&gt; 特性是关系型数据库可靠性的基石，也是从单机走向分布式系统时面临的核心挑战。本文深入讲解 ACID 的每一项特性及其在 MySQL InnoDB 中的实现机制。&lt;/p&gt;</description></item><item><title>MySQL InnoDB 存储引擎深度解析</title><link>https://plumephp.com/database-mysql-innodb/</link><pubDate>Thu, 13 Aug 2026 10:35:00 +0800</pubDate><guid>https://plumephp.com/database-mysql-innodb/</guid><description>&lt;p&gt;MySQL 是最流行的开源关系型数据库之一，而 &lt;strong&gt;InnoDB&lt;/strong&gt; 作为 MySQL 5.5 版本起默认的存储引擎，凭借其高可靠性、高性能和丰富的功能特性，成为绝大多数 OLTP 系统的首选。本文将深入剖析 InnoDB 的核心架构与关键组件，帮助读者理解其底层工作原理。&lt;/p&gt;</description></item><item><title>ClickHouse 深入解析与实战</title><link>https://plumephp.com/clickhouse-shen-ru-jie-xi-yu-shi-zhan/</link><pubDate>Mon, 03 Nov 2025 15:01:42 +0800</pubDate><guid>https://plumephp.com/clickhouse-shen-ru-jie-xi-yu-shi-zhan/</guid><description>&lt;h1 id="第一章clickhouse-概述与发展历程clickhouse-overview-and-evolution"&gt;第一章　ClickHouse 概述与发展历程（ClickHouse Overview and Evolution）&lt;/h1&gt;
&lt;h2 id="11诞生背景与设计初衷"&gt;1.1　诞生背景与设计初衷&lt;/h2&gt;
&lt;h3 id="一从日志到分析的痛点"&gt;一、从日志到分析的痛点&lt;/h3&gt;
&lt;p&gt;在 2010 年前后，互联网企业的流量监控与日志分析体系大多依赖于 &lt;strong&gt;Hadoop + Hive&lt;/strong&gt; 模型：&lt;/p&gt;</description></item><item><title>clickhouse和tidb对比分析</title><link>https://plumephp.com/clickhouse-he-tidb-dui-bi-fen-xi/</link><pubDate>Mon, 03 Nov 2025 15:00:42 +0800</pubDate><guid>https://plumephp.com/clickhouse-he-tidb-dui-bi-fen-xi/</guid><description>&lt;h2 id="一总览对比"&gt;一、总览对比&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;对比维度&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;ClickHouse&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;TiDB&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;类型定位&lt;/td&gt;
					&lt;td&gt;OLAP（在线分析处理）列式数据库&lt;/td&gt;
					&lt;td&gt;HTAP（混合事务 + 分析）分布式数据库&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;架构风格&lt;/td&gt;
					&lt;td&gt;Shared-Nothing 列存计算引擎&lt;/td&gt;
					&lt;td&gt;分布式事务数据库，兼容 MySQL 协议&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;主要用途&lt;/td&gt;
					&lt;td&gt;实时数据分析、BI 报表、大数据聚合&lt;/td&gt;
					&lt;td&gt;事务型业务 + 分析查询融合、OLTP/OLAP 混合&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据存储&lt;/td&gt;
					&lt;td&gt;列存 + 压缩 + 向量化计算&lt;/td&gt;
					&lt;td&gt;行存（TiKV）+ 列存（TiFlash）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;事务特性&lt;/td&gt;
					&lt;td&gt;弱事务（单表、单节点）&lt;/td&gt;
					&lt;td&gt;完整分布式事务（两阶段提交）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;扩展方式&lt;/td&gt;
					&lt;td&gt;水平扩展节点（Shard + Replica）&lt;/td&gt;
					&lt;td&gt;水平扩展 TiKV、TiFlash 节点&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SQL 兼容&lt;/td&gt;
					&lt;td&gt;类似 ANSI SQL（不完全兼容 MySQL）&lt;/td&gt;
					&lt;td&gt;高度兼容 MySQL 语法&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;典型用户&lt;/td&gt;
					&lt;td&gt;Yandex、Cloudflare、腾讯、字节跳动&lt;/td&gt;
					&lt;td&gt;PingCAP、知乎、Shopee、Bilibili&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;场景类型&lt;/td&gt;
					&lt;td&gt;日志分析、指标聚合、BI 看板&lt;/td&gt;
					&lt;td&gt;在线业务数据库、OLTP+OLAP 混合&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;一句话总结：&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>