<?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/tags/%E6%9F%A5%E8%AF%A2%E4%BC%98%E5%8C%96/</link><description>Recent content in 查询优化 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 14 Aug 2026 16:07:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/%E6%9F%A5%E8%AF%A2%E4%BC%98%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><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>03. MongoDB 索引类型与查询优化</title><link>https://plumephp.com/mongodb-indexing/</link><pubDate>Fri, 14 Aug 2026 12:03:00 +0800</pubDate><guid>https://plumephp.com/mongodb-indexing/</guid><description>&lt;p&gt;索引是数据库性能的核心。MongoDB 使用 B-Tree 索引，与关系型数据库类似，但有一些独特之处——如多键索引（数组索引）、文本索引、TTL 索引等。理解索引原理并正确使用 Explain 进行分析，是 MongoDB 调优的关键。&lt;/p&gt;</description></item></channel></rss>