﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>PHP博客-为了忘却的纪念   $bestmost-&gt;save("多多益善")-随笔分类-mysql 及其他</title><link>http://www.phpweblog.net/fuyongjie/category/578.html</link><description>言己及众</description><language>zh-cn</language><lastBuildDate>Sat, 08 Aug 2009 01:33:45 GMT</lastBuildDate><pubDate>Sat, 08 Aug 2009 01:33:45 GMT</pubDate><ttl>60</ttl><item><title>mysql proxy 实现读写分离</title><link>http://www.phpweblog.net/fuyongjie/archive/2009/08/07/6825.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Fri, 07 Aug 2009 03:15:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2009/08/07/6825.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/6825.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2009/08/07/6825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/6825.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/6825.html</trackback:ping><description><![CDATA[<p>【<a title="天津促销网" href="http://www.tjcuxiao.com" target="_blank">http://www.tjcuxiao.com</a>和<a title="目击者" href="http://www.mujiz.cn" target="_blank">http://www.mujiz.cn</a>友情赞助】<br /><br />听说<a href="http://jan.kneschke.de/2009/4/4/mysql-proxy-0-7-0-pre-release" target="_blank">mysql proxy 0.7.0即将发布</a>，正好<a href="http://www.ooso.net/archives/495" target="_blank">前些日子从bzr上获取mysql proxy的代码编译过</a>，看看当时bzr的版本号，和现在也差不了多少。在这期间，我又花了一些时间把mysql配置成读写分离，出了不少状况，由于使用的人不太多，解决问题超费劲——搜索不到有帮助的内容啊。</p>
		<p>但是我可能是比较幸运的，最后成功的实现了读写分离，目前在开发环境运行的比较稳定，所以有必要做个笔记分享一下。</p>
		<h2>读写分离脚本的问题</h2>
		<p>刚启动mysql proxy的时候，经常报错 -- "Mysql server has gone away"。我进一步缩小了可能出问题的范围(把环境简化是很重要的查错手段)，比如只连接一个mysql，或者只连接本机的mysql，没有太大帮助，最后是在mysql proxy的日志文件中看到些蛛丝马迹：</p>
		<blockquote>
				<p>(critical) proxy-plugin.c:1367: (connect_server) [string "/usr/local/share/mysql-proxy/r..."]:69: .address is deprecated. Use .src.name or .dst.name instead<br />(critical) (read_query) [string "/usr/local/share/mysql-proxy/r..."]:179: .address is deprecated. Use .src.name or .dst.name instead<br />(critical) proxy-plugin.c.1115: I have no server backend, closing connection </p>
		</blockquote>
		<p>在<a href="http://forums.mysql.com/list.php?146" target="_blank">mysql proxy的论坛</a>上看到有人碰到类似的问题，很简单，读写分离的lua脚本还是旧的，0.6.1时代的产物了，更糟糕的是，即便是即将发布的0.7.0，rw-splitting.lua也是旧版本的。lua脚本中的<b>.address</b>需要替换成<b>.src.name</b>或者<b>.dst.name</b>。</p>
		<p>
				<b>解决办法</b> —— 下载<a href="http://bazaar.launchpad.net/%7Ediego-fmpwizard/mysql-proxy/bug-43424/download/head%3A/rwsplitting.lua-20090112150705-l9v35osiopsn0nz0-10/rw-splitting.lua" target="_blank">更新之后的rw-splitting.lua</a>，情况会好转。</p>
		<h2>使用prepare方法无法获得结果</h2>
		<p>我在测试代码中采用php的pdo_mysql，单独连接mysql是毫无问题的，然而配合mysql proxy使用则是屡屡受挫，查询经常没有结果返回，比较随机，从日志中也找不到有帮助的内容。这次没有找到解决办法，所以我绕了过去，在连接mysql 的时候使用伪prepare的方式：</p>
		<div>
				<span>
						<a href="http://www.ooso.net/#" target="_blank">
								<br />
						</a>
				</span>
		</div>
		<div>
				<span>PHP:</span>
				<div>
						<div>
								<ol>
										<li style="FONT-WEIGHT: normal; COLOR: rgb(58,106,139); FONT-STYLE: normal; FONT-FAMILY: 'Courier New',Courier,monospace">
												<div style="FONT-WEIGHT: normal; FONT-FAMILY: 'Courier New',Courier,monospace">
														<span style="COLOR: rgb(0,0,255)">$option</span> = <span style="COLOR: rgb(0,0,102)">array</span><span style="FONT-WEIGHT: bold; COLOR: rgb(0,102,0)">(</span>PDO::<span style="COLOR: rgb(0,102,0)">ATTR_EMULATE_PREPARES</span> =&gt; <span style="COLOR: rgb(128,0,0)">1</span><span style="FONT-WEIGHT: bold; COLOR: rgb(0,102,0)">)</span>; </div>
										</li>
								</ol>
						</div>
				</div>
		</div>
		<p>据称emulate方式的性能比prepare要好，所以这也算安慰奖了。</p>
		<h2>专门的lua脚本分支</h2>
		<p>lua脚本开发滞后，是一个比较严重的问题，所以在邮件组上看到有个新的lua脚本分支出来 —— <a href="https://launchpad.net/mysql-proxy-lua-scripts" target="_blank">https://launchpad.net/mysql-proxy-lua-scripts</a>。希望开发速度能跟上来。</p>
		<p>
				<br />
		</p>
		<h2>keepalive参数</h2>
		<p>mysql proxy还不算太稳定，偶尔crash我也不觉得惊讶，所以新增的keepalive参数很有用。在proxy启动的时候，加上--keepalive参数，它便会努力保持proxy的运行状态，停止了也会自动重启。</p><img src ="http://www.phpweblog.net/fuyongjie/aggbug/6825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2009-08-07 11:15 <a href="http://www.phpweblog.net/fuyongjie/archive/2009/08/07/6825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 在MySQL中如何为连接添加索引（转）</title><link>http://www.phpweblog.net/fuyongjie/archive/2009/05/09/6468.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Sat, 09 May 2009 03:39:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2009/05/09/6468.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/6468.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2009/05/09/6468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/6468.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/6468.html</trackback:ping><description><![CDATA[<div class="blog_content">简单的3个表的连接 <br /><br /><br />表结构很简单，3个表tblA, tblB, tblC，每个表有3个字段：col1, col2, col3。 <br />在没有索引的情况下连接3个表 <br /><br /><br />SELECT <br />* <br />FROM <br />tblA, <br />tblB, <br />tblC <br />WHERE <br />tblA.col1 = tblB.col1 <br />AND tblA.col2 = tblC.col1; <br /><br /><br />explain的结果如下： <br /><div class="dp-highlighter"><div class="bar"><div class="tools"> </div></div><ol class="dp-j"><li><span><span>+-------+------+---------------+------+---------+------+------+-------------+   </span></span></li><li><span>| table | type | possible_keys | key  | key_len | ref  | rows | Extra       |   </span></li><li><span>+-------+------+---------------+------+---------+------+------+-------------+   </span></li><li><span>| tblA  | ALL  | NULL          | NULL |    NULL | NULL | </span><span class="number"><font color="#c00000">1000</font></span><span> |             |   </span></li><li><span>| tblB  | ALL  | NULL          | NULL |    NULL | NULL | </span><span class="number"><font color="#c00000">1000</font></span><span> | <span class="hilite2">Using</span> where |   </span></li><li><span>| tblC  | ALL  | NULL          | NULL |    NULL | NULL | </span><span class="number"><font color="#c00000">1000</font></span><span> | <span class="hilite2">Using</span> where |   </span></li><li><span>+-------+------+---------------+------+---------+------+------+-------------+  </span></li></ol></div><pre class="java" style="DISPLAY: none" name="code_lighted">   +-------+------+---------------+------+---------+------+------+-------------+
   | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
   +-------+------+---------------+------+---------+------+------+-------------+
   | tblA  | ALL  | NULL          | NULL |    NULL | NULL | 1000 |             |
   | tblB  | ALL  | NULL          | NULL |    NULL | NULL | 1000 | <span class="hilite2">Using</span> where |
   | tblC  | ALL  | NULL          | NULL |    NULL | NULL | 1000 | <span class="hilite2">Using</span> where |
   +-------+------+---------------+------+---------+------+------+-------------+</pre><br /><br /><br />最后，在<span class="hilite1">MySQL</span>的手册中(7.2.1)： <br />表以它们在处理查询过程中将被<span class="hilite1">MySQL</span>读入的顺序被列出。<span class="hilite1">MySQL</span>用一遍扫描多次联接（single-sweep multi-join）的方式解决所有联接。这意味着<span class="hilite1">MySQL</span>从第一个表中读一行，然后找到在第二个表中的一个匹配行，然后在第3个表中等等。当所有的表处理完后，它输出选中的列并且返回表清单直到找到一个有更多的匹配行的表。从该表读入下一行并继续处理下一个表。 <br />如手册所说的，<span class="hilite1">MySQL</span>读第一个表(tnlA)，然后第二个(tblB)，然后第三个(tblC)，像explain中输出的一样。先前的表中的值用来查找当前表中的行。在我们的例子中，tblA中的值用来找tblB中的匹配行，然后tblB的值来找tblC的行。当一个完整的扫描结束(在表tblA,tblB,tblC中找到了结果)，<span class="hilite1">MySQL</span>不会返回tblA,它到tblB中查看是否有更多的行匹配当前tblA的值。如果有，它拿出这一行，然后再在tblC中找匹配的。记住 <span class="hilite1">MySQL</span>连接的基本原则是很重要的：先前的表中的值用来查找当前表中的行。 <br /><br /><br />按原理建索引 <br /><br />知道了<span class="hilite1">MySQL</span>使用从tblA中得到的值查找tblB中的行，我们需要怎么建索引来帮助<span class="hilite1">MySQL</span>？为此我们要知道它需要什么。考虑连接tblA和 tblB：它们通过“tblA.col1 = tblB.col1”来连接。我们已经有了tblA.col1的值，所以<span class="hilite1">MySQL</span>需要一个tblB.col1的值来完成等值操作。因此如果<span class="hilite1">MySQL</span>需要tblB.col1，我们就在tblB.col1上加索引。加了之后，这是新的explain结果： <br /><br /><div class="dp-highlighter"><div class="bar"><div class="tools"> </div></div><ol class="dp-j"><li><span><span>+-------+------+---------------+----------+---------+-----------+------+-------------+   </span></span></li><li><span>| table | type | possible_keys | key      | key_len | ref       | rows | Extra       |   </span></li><li><span>+-------+------+---------------+----------+---------+-----------+------+-------------+   </span></li><li><span>| tblA  | ALL  | NULL          | NULL     |    NULL | NULL      | </span><span class="number"><font color="#c00000">1000</font></span><span> |             |   </span></li><li><span>| tblB  | ref  | ndx_col1      | ndx_col1 |       </span><span class="number"><font color="#c00000">5</font></span><span> | tblA.col1 |    </span><span class="number"><font color="#c00000">1</font></span><span> | <span class="hilite2">Using</span> where |   </span></li><li><span>| tblC  | ALL  | NULL          | NULL     |    NULL | NULL      | </span><span class="number"><font color="#c00000">1000</font></span><span> | <span class="hilite2">Using</span> where |   </span></li><li><span>+-------+------+---------------+----------+---------+-----------+------+-------------+  </span></li></ol></div><pre class="java" style="DISPLAY: none" name="code_lighted">+-------+------+---------------+----------+---------+-----------+------+-------------+
| table | type | possible_keys | key      | key_len | ref       | rows | Extra       |
+-------+------+---------------+----------+---------+-----------+------+-------------+
| tblA  | ALL  | NULL          | NULL     |    NULL | NULL      | 1000 |             |
| tblB  | ref  | ndx_col1      | ndx_col1 |       5 | tblA.col1 |    1 | <span class="hilite2">Using</span> where |
| tblC  | ALL  | NULL          | NULL     |    NULL | NULL      | 1000 | <span class="hilite2">Using</span> where |
+-------+------+---------------+----------+---------+-----------+------+-------------+
</pre><br /><br />如上，<span class="hilite1">MySQL</span>现在使用ndx_col1索引来连接tblB到tblA。就是说，当<span class="hilite1">MySQL</span>要找tblB中的行时，使用了ndx_col1索引通过 tblA.col1的值直接得到匹配的行，而不是像以前需要做表扫描。这就是为什么tblB的ref列说“tablA.col1”。tblC现在还是用表扫描，这可以通过同样的方法解决。查看<span class="hilite1">MySQL</span>的需求：从sql中连接两表的语句“tblA.col2 = tblC.col1”可以看出它需要tblC.col1因为我们已经有了tblA.col2。给这一列加上索引之后explain： <br /><br /><div class="dp-highlighter"><div class="bar"><div class="tools"> </div></div><ol class="dp-j"><li><span><span>+-------+------+---------------+----------+---------+-----------+------+-------------+   </span></span></li><li><span>| table | type | possible_keys | key      | key_len | ref       | rows | Extra       |   </span></li><li><span>+-------+------+---------------+----------+---------+-----------+------+-------------+   </span></li><li><span>| tblA  | ALL  | NULL          | NULL     |    NULL | NULL      | </span><span class="number"><font color="#c00000">1000</font></span><span> |             |   </span></li><li><span>| tblB  | ref  | ndx_col1      | ndx_col1 |       </span><span class="number"><font color="#c00000">5</font></span><span> | tblA.col1 |    </span><span class="number"><font color="#c00000">1</font></span><span> | <span class="hilite2">Using</span> where |   </span></li><li><span>| tblC  | ref  | ndx_col1      | ndx_col1 |       </span><span class="number"><font color="#c00000">5</font></span><span> | tblA.col2 |    </span><span class="number"><font color="#c00000">1</font></span><span> | <span class="hilite2">Using</span> where |   </span></li><li><span>+-------+------+---------------+----------+---------+-----------+------+-------------+  </span></li></ol></div><pre class="java" style="DISPLAY: none" name="code_lighted">+-------+------+---------------+----------+---------+-----------+------+-------------+
| table | type | possible_keys | key      | key_len | ref       | rows | Extra       |
+-------+------+---------------+----------+---------+-----------+------+-------------+
| tblA  | ALL  | NULL          | NULL     |    NULL | NULL      | 1000 |             |
| tblB  | ref  | ndx_col1      | ndx_col1 |       5 | tblA.col1 |    1 | <span class="hilite2">Using</span> where |
| tblC  | ref  | ndx_col1      | ndx_col1 |       5 | tblA.col2 |    1 | <span class="hilite2">Using</span> where |
+-------+------+---------------+----------+---------+-----------+------+-------------+

</pre><br /><br />更复杂的查询 <br /><br /><br />在实际中不会遇到刚才那种sql。所以你可能更想看看这样的： <br /><br /><br />SELECT <br />COUNT(tblB.a_id) as correct, <br />tblA.type, <br />tblA.se_type <br />FROM <br />tblA, <br />tblB, <br />tblC, <br />tblD <br />WHERE <br />tblA.ex_id = tblC.ex_id <br />AND tblC.st_ex_id = tblB.st_ex_id <br />AND tblB.q_num = tblA.q_num <br />AND tblB.se_num = tblA.se_num <br />AND tblD.ex_id = tblA.ex_id <br />AND tblD.exp &lt;&gt; tblB.se_num <br />AND tblB.ans = tblA.ans <br />AND tblA.ex_id = 1001 <br />AND tblC.r_id = 542 <br />GROUP BY <br />tblA.type, <br />tblA.se_type; <br /><br /><br />乍一看是很复杂的：有4个表，有聚合函数，有9个where条件，还有一个group by。explain的伟大之处在于我们现在可以忽略这些，每次只看两个表，判断每一步<span class="hilite1">MySQL</span>需要什么。这是一个实际的查询，只是字段名有一些改动。explain的结果： <br /><br /><div class="dp-highlighter"><div class="bar"><div class="tools"> </div></div><ol class="dp-j"><li><span><span>+-------+--------+---------------+---------+---------+---------------+-------+----------------------------------------------+   </span></span></li><li><span>| table | type   | possible_keys | key     | key_len | ref           | rows  | Extra                                        |   </span></li><li><span>+-------+--------+---------------+---------+---------+---------------+-------+----------------------------------------------+   </span></li><li><span>| tblA  | ALL    | NULL          | NULL    |    NULL | NULL          |  </span><span class="number"><font color="#c00000">1080</font></span><span> | <span class="hilite2">Using</span> where; <span class="hilite2">Using</span> temporary; <span class="hilite2">Using</span> <span class="hilite3">filesort</span> |   </span></li><li><span>| tblB  | ALL    | NULL          | NULL    |    NULL | NULL          | </span><span class="number"><font color="#c00000">87189</font></span><span> | <span class="hilite2">Using</span> where                                  |   </span></li><li><span>| tblC  | eq_ref | PRIMARY       | PRIMARY |       </span><span class="number"><font color="#c00000">4</font></span><span> | tblB.st_ex_id |     </span><span class="number"><font color="#c00000">1</font></span><span> | <span class="hilite2">Using</span> where                                  |   </span></li><li><span>| tblD  | eq_ref | PRIMARY       | PRIMARY |       </span><span class="number"><font color="#c00000">4</font></span><span> | tblA.ex_id    |     </span><span class="number"><font color="#c00000">1</font></span><span> | <span class="hilite2">Using</span> where                                  |   </span></li><li><span>+-------+--------+---------------+---------+---------+---------------+-------+----------------------------------------------+  </span></li></ol></div><pre class="java" style="DISPLAY: none" name="code_lighted">+-------+--------+---------------+---------+---------+---------------+-------+----------------------------------------------+
| table | type   | possible_keys | key     | key_len | ref           | rows  | Extra                                        |
+-------+--------+---------------+---------+---------+---------------+-------+----------------------------------------------+
| tblA  | ALL    | NULL          | NULL    |    NULL | NULL          |  1080 | <span class="hilite2">Using</span> where; <span class="hilite2">Using</span> temporary; <span class="hilite2">Using</span><span class="hilite3">filesort</span> |
| tblB  | ALL    | NULL          | NULL    |    NULL | NULL          | 87189 | <span class="hilite2">Using</span> where                                  |
| tblC  | eq_ref | PRIMARY       | PRIMARY |       4 | tblB.st_ex_id |     1 | <span class="hilite2">Using</span> where                                  |
| tblD  | eq_ref | PRIMARY       | PRIMARY |       4 | tblA.ex_id    |     1 | <span class="hilite2">Using</span> where                                  |
+-------+--------+---------------+---------+---------+---------------+-------+----------------------------------------------+
</pre><br /><br />判断连接影响的主要看结果集。结果集就是查询的结果。对于连接，一个估计结果集大小的方法是把<span class="hilite1">MySQL</span>预测的读取每个表的行数相乘。作为估计，这样做比较偏向于坏的情况，因为where条件通常会减少很多的行数。但这个查询的结果集有9400万行。这就是没有索引连接很危险的原因；几千行乘几千行你就会有一个上百万的结果集了。 <br />那么现在这个查询需要什么？从tblA和tblB开始。在sql中： <br /><br /><br />AND tblB.q_num = tblA.q_num <br />AND tblB.se_num = tblA.se_num <br />AND tblB.ans = tblA.ans <br /><br /><br /><span class="hilite1">MySQL</span> 至少需要q_num, se_num, ans中的一个。我选择在se_num和q_num上加索引因为在几乎所有其他的查询中我都会需要它们。折中是优化的一部分，多数人没有时间去为每一个查询找最优的索引方案，只能是找到一个对于大多数情况而言最优的方案。在tblB上加索引(se_num, q_num)，explain的结果： <br /><br /><div class="dp-highlighter"><div class="bar"><div class="tools"> </div></div><ol class="dp-j"><li><span><span>+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+   </span></span></li><li><span>| table | type   | possible_keys | key         | key_len | ref                    | rows | Extra                                        |   </span></li><li><span>+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+   </span></li><li><span>| tblA  | ALL    | NULL          | NULL        |    NULL | NULL                   | </span><span class="number"><font color="#c00000">1080</font></span><span> | <span class="hilite2">Using</span> where; <span class="hilite2">Using</span> temporary; <span class="hilite2">Using</span> <span class="hilite3">filesort</span> |   </span></li><li><span>| tblB  | ref    | ndx_secn_qn   | ndx_secn_qn |       </span><span class="number"><font color="#c00000">2</font></span><span> | tblA.se_num,tblA.q_num |  </span><span class="number"><font color="#c00000">641</font></span><span> | <span class="hilite2">Using</span> where                                  |   </span></li><li><span>| tblC  | eq_ref | PRIMARY       | PRIMARY     |       </span><span class="number"><font color="#c00000">4</font></span><span> | tblB.st_ex_id          |    </span><span class="number"><font color="#c00000">1</font></span><span> | <span class="hilite2">Using</span> where                                  |   </span></li><li><span>| tblD  | eq_ref | PRIMARY       | PRIMARY     |       </span><span class="number"><font color="#c00000">4</font></span><span> | tblA.ex_id             |    </span><span class="number"><font color="#c00000">1</font></span><span> | <span class="hilite2">Using</span> where                                  |   </span></li><li><span>+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+  </span></li></ol></div><pre class="java" style="DISPLAY: none" name="code_lighted">+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+
| table | type   | possible_keys | key         | key_len | ref                    | rows | Extra                                        |
+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+
| tblA  | ALL    | NULL          | NULL        |    NULL | NULL                   | 1080 | <span class="hilite2">Using</span> where; <span class="hilite2">Using</span> temporary; <span class="hilite2">Using</span><span class="hilite3">filesort</span> |
| tblB  | ref    | ndx_secn_qn   | ndx_secn_qn |       2 | tblA.se_num,tblA.q_num |  641 | <span class="hilite2">Using</span> where                                  |
| tblC  | eq_ref | PRIMARY       | PRIMARY     |       4 | tblB.st_ex_id          |    1 | <span class="hilite2">Using</span> where                                  |
| tblD  | eq_ref | PRIMARY       | PRIMARY     |       4 | tblA.ex_id             |    1 | <span class="hilite2">Using</span> where                                  |
+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+
</pre><br /><br />现在结果集下降了99.3%变为692280行。但为什么要停在这里？我们可以很容易的解决tblA的表扫描。因为它是第一个表，我们并不需要为连接加索引，这在tblB上已经做过了。一般来说，给第一个表加索引可以把它当成只在这一个表上查询的情况。在这个例子中很幸运，tblA 是："AND tblA.ex_id = 1001"。我们只需要加ex_id索引： <br /><br /><br /><div class="dp-highlighter"><div class="bar"><div class="tools"><a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://boin.javaeye.com/blog/122845#"></a> </div></div><ol class="dp-j"><li><span><span>+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+   </span></span></li><li><span>| table | type   | possible_keys | key         | key_len | ref                    | rows | Extra                                        |   </span></li><li><span>+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+   </span></li><li><span>| tblA  | ref    | ndx_ex_id     | ndx_ex_id   |       </span><span class="number"><font color="#c00000">4</font></span><span> | </span><span class="keyword">const</span><span>                  |    </span><span class="number"><font color="#c00000">1</font></span><span> | <span class="hilite2">Using</span> where; <span class="hilite2">Using</span> temporary; <span class="hilite2">Using</span> <span class="hilite3">filesort</span> |   </span></li><li><span>| tblB  | ref    | ndx_secn_qn   | ndx_secn_qn |       </span><span class="number"><font color="#c00000">2</font></span><span> | tblA.se_num,tblA.q_num |  </span><span class="number"><font color="#c00000">641</font></span><span> | <span class="hilite2">Using</span> where                                  |   </span></li><li><span>| tblC  | eq_ref | PRIMARY       | PRIMARY     |       </span><span class="number"><font color="#c00000">4</font></span><span> | tblB.st_ex_id          |    </span><span class="number"><font color="#c00000">1</font></span><span> | <span class="hilite2">Using</span> where                                  |   </span></li><li><span>| tblD  | eq_ref | PRIMARY       | PRIMARY     |       </span><span class="number"><font color="#c00000">4</font></span><span> | tblA.ex_id             |    </span><span class="number"><font color="#c00000">1</font></span><span> | <span class="hilite2">Using</span> where                                  |   </span></li><li><span>+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+  </span></li></ol></div><pre class="java" style="DISPLAY: none" name="code_lighted">+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+
| table | type   | possible_keys | key         | key_len | ref                    | rows | Extra                                        |
+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+
| tblA  | ref    | ndx_ex_id     | ndx_ex_id   |       4 | const                  |    1 | <span class="hilite2">Using</span> where; <span class="hilite2">Using</span> temporary; <span class="hilite2">Using</span><span class="hilite3">filesort</span> |
| tblB  | ref    | ndx_secn_qn   | ndx_secn_qn |       2 | tblA.se_num,tblA.q_num |  641 | <span class="hilite2">Using</span> where                                  |
| tblC  | eq_ref | PRIMARY       | PRIMARY     |       4 | tblB.st_ex_id          |    1 | <span class="hilite2">Using</span> where                                  |
| tblD  | eq_ref | PRIMARY       | PRIMARY     |       4 | tblA.ex_id             |    1 | <span class="hilite2">Using</span> where                                  |
+-------+--------+---------------+-------------+---------+------------------------+------+----------------------------------------------+
</pre><br /><br />现在结果集是641行。相比开始的9400万，可以说了下降了100%。如果继续研究这个查询我们还可以去掉temp table和<span class="hilite3">filesort</span>，但现在查询已经很快了，也已经说明了如何为连接加索引。尽管最初看这个查询很麻烦，但可以看到只要每次独立的看两张表，为 <span class="hilite1">MySQL</span>的需求加索引，整个过程并不困难。 <br /><br /><br /><font color="#ff0000">结论 <br /></font><br />为复杂的连接加索引要认识到两件事： <br /><br />1. 不管sql多复杂，每次只看explain中的两个表 <br /><br />2. 先前表中的值已经有了，我们的工作就是通过索引帮助<span class="hilite1">MySQL</span>在当前表中使用这些值来找到匹配行 </div>
		<p class="right articalinfo"> </p>
		<h1>
				<font color="white">
						<a href="http://www.78yi.cn">千百亿</a>
				</font>
		</h1><img src ="http://www.phpweblog.net/fuyongjie/aggbug/6468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2009-05-09 11:39 <a href="http://www.phpweblog.net/fuyongjie/archive/2009/05/09/6468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL开发实用知识集合</title><link>http://www.phpweblog.net/fuyongjie/archive/2009/02/23/6344.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Mon, 23 Feb 2009 05:33:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2009/02/23/6344.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/6344.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2009/02/23/6344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/6344.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/6344.html</trackback:ping><description><![CDATA[我在最近的几个项目中深刻理解到，其实项目应用的瓶颈还是在db端，在只有少量数据及极少并发的情况下，并不需要多少的技巧就可以得到我们想要的结果，但是当数据量达到一定量级的时候，程序的每一个细节，数据库的设计都会影响到系统的性能。这里就数据库开发及优化的话题和大家做个讨论和分析，也请大家完善，这里就以下几个话题，我先发表自己的见解。<br>
<br>
1.存储引擎的选择<br>
<br>
2.索引的设计及使用<br>
<br>
3.大批量插入时SQL语句的优化<br>
<h2>存储引擎的选择</h2>
<div class="t_msgfont" id="postmessage_737305">声明：本文所针对的数据库版本都是MYSQL 5<br>
<br>
&nbsp; &nbsp;&nbsp; &nbsp;这里我主要针对两种存储引擎进行简单比较分别是MyISAM和InnoDB，首先比较下区别：<br>
&nbsp; &nbsp;&nbsp; &nbsp;1. MyISAM不支持事务，不支持外键，优点是访问速度高，批量插入速度快。假设大量的操作是select、insert，建议采用该存储引擎。但是在我的实际应用中，出现过批量插入过于频繁的时候，当数据量到达一定级别，出现表损坏的情况。<br>
<br>
&nbsp; &nbsp;&nbsp; &nbsp;2. InnoDB支持事务处理，但是相对于前者，处理效率低一些，并且其索引及数据也更占用磁盘空间。在存储一些关键数据，并需要对其进行事务操作的时候，我们可以选择innodb，当然，我认为他不应该是访问量太大的。<br>
<br>
<h2>索引的设计及使用</h2>
没有索引的表是恐怖的，除非里头没多少数据，但是怎么设计索引是合理的？恐怕不是所有人都明白，这里简要分析下索引的设计及使用。<br>
<br>
1. 索引通常是设置where字句中的列，如果你设置select后的列，这是没有任何意义的。当然你需要对某列进行排序，order by后的列也是可以建成索引的。<br>
<br>
2. 使用唯一索引，主键就是最好的例子，假设你建的索引列，大量都是重复的，例如：性别，那么这样的索引并不会加快搜索速度。至于为什么，请大家自行了解索引的工作原理。<br>
<br>
3. 只要有可能，就要尽量限定索引的长度，例如索引列为 char(100)，在其前10个字符大部分都是唯一的，请设置索引的长度为10，使用短索引可以加快查询速度，并节省硬盘空间。<br>
<br>
4. 索引的左前缀特性，联合索引实质上也是建立了多个的索引，那么是建立联合索引好还是分别建多个索引好呢？显然前者更好，利用左前缀特性，只要联合索引的最左的列被用到，那么索引都会被使用。<br>
<br>
5. 当然，最后要说的是，不要过度使用索引，索引越多，插入的速度越慢，尤其到数据量庞大时，同时，大量的索引将耗费很多硬盘空间，造成不必要的浪费。<br>
<br>
下面举几个列子来说明索引的使用：<br>
<br>
1.联合索引的左前缀<br>
<br>
先看索引结构:
<div class="blockcode"><em onclick="copycode($('code0'));">复制内容到剪贴板
</em>
<h5><em onclick="copycode($('code0'));">代码:</em></h5>
<code id="code0"><em onclick="copycode($('code0'));">mysql&gt; show index from user;<br>
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+<br>
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
Collation | Cardinality | Sub_part | Packed | Null | Index_type |
Comment |<br>
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+<br>
| user&nbsp;&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 0 | PRIMARY&nbsp;&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;1 | user_id&nbsp; &nbsp;&nbsp;&nbsp;| A&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;2 |&nbsp; &nbsp;&nbsp;&nbsp;NULL | NULL&nbsp; &nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;| BTREE&nbsp; &nbsp;&nbsp; &nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>
| user&nbsp;&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 1 | user&nbsp; &nbsp;&nbsp;&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;1 | username&nbsp; &nbsp; | A&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;NULL |&nbsp; &nbsp;&nbsp;&nbsp;NULL | NULL&nbsp; &nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;| BTREE&nbsp; &nbsp;&nbsp; &nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>
| user&nbsp;&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 1 | user&nbsp; &nbsp;&nbsp;&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;2 | order&nbsp; &nbsp;&nbsp; &nbsp; | A&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;NULL |&nbsp; &nbsp;&nbsp;&nbsp;NULL | NULL&nbsp; &nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;| BTREE&nbsp; &nbsp;&nbsp; &nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>
| user&nbsp;&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 1 | user&nbsp; &nbsp;&nbsp;&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;3 | email&nbsp; &nbsp;&nbsp; &nbsp; | A&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;NULL |&nbsp; &nbsp;&nbsp;&nbsp;NULL | NULL&nbsp; &nbsp;| YES&nbsp;&nbsp;| BTREE&nbsp; &nbsp;&nbsp; &nbsp;|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br>
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+<br>
4 rows in set (0.00 sec)</em></code></div>
<em onclick="copycode($('code0'));">user是联合索引的名称，包含3个列，分别是username,order,email。接下来执行以下sql，使用explain命令来分析下运行结果。
</em>
<div class="blockcode"><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));">复制内容到剪贴板
</em></em>
<h5><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));">代码:</em></em></h5>
<code id="code1"><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"> <br>
mysql&gt; explain select * from user where username='leehui';<br>
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+<br>
| id | select_type | table | type | possible_keys | key&nbsp;&nbsp;| key_len | ref&nbsp; &nbsp;| rows | Extra&nbsp; &nbsp;&nbsp; &nbsp; |<br>
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+<br>
|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| user&nbsp;&nbsp;| ref&nbsp;&nbsp;| user&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; | user | 152&nbsp; &nbsp;&nbsp;&nbsp;| const |&nbsp; &nbsp; 1 | Using where |<br>
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+<br>
1 row in set (0.00 sec)<br>
<br>
mysql&gt; explain select * from user where pws='123';<br>
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+<br>
| id | select_type | table | type | possible_keys | key&nbsp;&nbsp;| key_len | ref&nbsp;&nbsp;| rows | Extra&nbsp; &nbsp;&nbsp; &nbsp; |<br>
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+<br>
|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| user&nbsp;&nbsp;| ALL&nbsp;&nbsp;| NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; | NULL | NULL&nbsp; &nbsp; | NULL |&nbsp; &nbsp; 2 | Using where |<br>
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+<br>
1 row in set (0.00 sec)</em></em></code></div>
<em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));">在两句sql中，我们可以发现，第一个sql虽然没用上，全部的索引列，但由于使用到了最左端的列，所以，联合索引还是启用了，第二句没有使用到最左的列，所以索引没有使用。<br>
<br>
2.关于like关键字<br>
对于使用like的查询，需要注意的是只有列的%不在第一个字符索引才可能被使用。以下分别展示了使用like的查询，第一个是索引被使用的，第二个是索引未被使用的。
</em></em>
<div class="blockcode"><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));">复制内容到剪贴板
</em></em></em>
<h5><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));">代码:</em></em></em></h5>
<code id="code2"><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"> <br>
mysql&gt; explain select * from user where username like'lee%';<br>
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+<br>
| id | select_type | table | type&nbsp;&nbsp;| possible_keys | key&nbsp;&nbsp;| key_len | ref&nbsp;&nbsp;| rows | Extra&nbsp; &nbsp;&nbsp; &nbsp; |<br>
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+<br>
|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| user&nbsp;&nbsp;| range | user&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; | user | 152&nbsp; &nbsp;&nbsp;&nbsp;| NULL |&nbsp; &nbsp; 1 | Using where |<br>
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+<br>
1 row in set (0.00 sec)<br>
<br>
mysql&gt; explain select * from user where username like'%lee';<br>
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+<br>
| id | select_type | table | type | possible_keys | key&nbsp;&nbsp;| key_len | ref&nbsp;&nbsp;| rows | Extra&nbsp; &nbsp;&nbsp; &nbsp; |<br>
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+<br>
|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| user&nbsp;&nbsp;| ALL&nbsp;&nbsp;| NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; | NULL | NULL&nbsp; &nbsp; | NULL |&nbsp; &nbsp; 2 | Using where |<br>
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+<br>
1 row in set (0.00 sec)</em></em></em></code></div>
<em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));">3. 查看索引使用情况<br>
使用以下命令
</em></em></em>
<div class="blockcode"><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));">复制内容到剪贴板
</em></em></em></em>
<h5><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));">代码:</em></em></em></em></h5>
<code id="code3"><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));">mysql&gt; show status like 'Handler_read_key';<br>
+------------------+-------+<br>
| Variable_name&nbsp; &nbsp; | Value |<br>
+------------------+-------+<br>
| Handler_read_key | 0&nbsp; &nbsp;&nbsp;&nbsp;|<br>
+------------------+-------+<br>
1 row in set (0.00 sec)</em></em></em></em></code></div>
<em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));">如果索引正在工作，那么Handler_read_key 会很高，如果查询中出现Handler_read_rnd_next的值很高，则表明查询低效，索引的应用并不合理。<br>
<br>
</em></em></em></em>
<h2><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));">大批量插入时的SQL语句优化</em></em></em></em></h2>
<em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));">在大量插入时，尤其是并发插入时，mysql往往要承受更高的负载，使用mysql administortar的健康检查就可以发现，其avg的值相当高，在这种情况下，首先要做的是sql语句的优化，比较下面两个句子，后者的速度比前者要快得多。因为减少大量的连接。
</em></em></em></em>
<div class="blockcode"><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));">复制内容到剪贴板
</em></em></em></em></em>
<h5><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));">代码:</em></em></em></em></em></h5>
<code id="code4"><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));"> <br>
insert into test values(aa,bb)<br>
insert into test values(cc,dd)<br>
<br>
<br>
insert into test values (aa),(bb),(cc),(dd) </em></em></em></em></em></code></div>
<em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));">在 我的一个实际应用中，由于需要经常有数百个并发的插入，我还采用了insert delayed into来取代insert
into，前者与后者的区别是在执行插入语句时，数据保存在内存队列中，待数据库空闲时执行，但是会立即返回一个插入成功的信息。使用insert
delayed
into时需要注意：此时不能使用mysql_insert_id()，因为此时并没有真正插入。对特别重要的数据不宜采用该语句，避免数据以外丢失。<br>
<br>
</em></em></em></em></em>
<h2><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));">其他方面的杂谈</em></em></em></em></em></h2>
<em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));">1.mysql myisam 表超过4G无法访问的解决<br>
<br>
myisam引擎默认是支持4GB，innodb理论上可以到6TB，假设单张表容量超过4GB，可能导致表都无法访问了。可以通过以下命令增加表最大数据量：
</em></em></em></em></em>
<div class="blockcode"><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));"><em onclick="copycode($('code5'));">复制内容到剪贴板
</em></em></em></em></em></em>
<h5><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));"><em onclick="copycode($('code5'));">代码:</em></em></em></em></em></em></h5>
<code id="code5"><em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));"><em onclick="copycode($('code5'));">mysql&gt; alter table user MAX_ROWS=1000000000 AVG_ROW_LENGTH=15000;<br>
Query OK, 2 rows affected (0.09 sec)<br>
Records: 2&nbsp;&nbsp;Duplicates: 0&nbsp;&nbsp;Warnings: 0</em></em></em></em></em></em></code></div>
<em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));"><em onclick="copycode($('code5'));">这样修改后数据文件可以支持到208TB左右。</em></em></em></em></em></em></div>
<em onclick="copycode($('code0'));"><em onclick="copycode($('code1'));"><em onclick="copycode($('code2'));"><em onclick="copycode($('code3'));"><em onclick="copycode($('code4'));"><em onclick="copycode($('code5'));">
<a href="http://www.extshow.com/PHP%BC%B0%CF%E0%B9%D8%BC%BC%CA%F5/154.html">
</a>
</em></em></em></em></em></em><br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/6344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2009-02-23 13:33 <a href="http://www.phpweblog.net/fuyongjie/archive/2009/02/23/6344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql一句话更新排行</title><link>http://www.phpweblog.net/fuyongjie/archive/2009/01/12/6279.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Mon, 12 Jan 2009 07:52:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2009/01/12/6279.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/6279.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2009/01/12/6279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/6279.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/6279.html</trackback:ping><description><![CDATA[<br><br>ID&nbsp; &nbsp; 访问量&nbsp;  排名<br>1&nbsp; &nbsp; &nbsp; &nbsp; 58&nbsp; &nbsp; &nbsp; &nbsp; 0<br>2&nbsp; &nbsp; &nbsp; &nbsp; 21&nbsp; &nbsp; &nbsp; &nbsp; 0<br>3&nbsp; &nbsp; &nbsp; &nbsp; 36&nbsp; &nbsp; &nbsp; &nbsp; 0<br>4&nbsp; &nbsp; &nbsp; &nbsp; 12&nbsp; &nbsp; &nbsp; &nbsp; 0<br><br>如果通过一句话SQL语句上面的更新成下面的效果（只能一句SQL）不知道怎么做请大家帮忙<br><br>了<br><br><br>ID&nbsp; &nbsp; 访问量&nbsp;  排名<br>1&nbsp; &nbsp; &nbsp; &nbsp; 58&nbsp; &nbsp; &nbsp; &nbsp; 1<br>2&nbsp; &nbsp; &nbsp; &nbsp; 21&nbsp; &nbsp; &nbsp; &nbsp; 3<br>3&nbsp; &nbsp; &nbsp; &nbsp; 36&nbsp; &nbsp; &nbsp; &nbsp; 2<br>4&nbsp; &nbsp; &nbsp; &nbsp; 12&nbsp; &nbsp; &nbsp; &nbsp; 4 <br><br><br>答<br><br>update 表格 set 排名= (@r_c:=IFNULL(@r_c, 0)+1) order by 访问量 desc;
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/6279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2009-01-12 15:52 <a href="http://www.phpweblog.net/fuyongjie/archive/2009/01/12/6279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>preg_match_all结合str_replace替换内容中所有img</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/10/10/5874.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Fri, 10 Oct 2008 08:42:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/10/10/5874.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5874.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/10/10/5874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5874.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5874.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">最近做站的时候，采集了大量的数据，但采回来的数据基本上都要经过过滤原站保留的数据，其中IMG就是一个地方。网站上好多这些应用例子似乎没有必要&#8220;秀&#8221;出来，但站已几天没写日志，那就来一个吧<br><br>采集回来的图片img标签中，有好多javascript脚本和无用的信息，必需过替换自己想要的，比如alt。先看看要过滤的内容，我随便复制出来：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">sdfsdfsdf</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">img&nbsp;</span><span style="color: #ff0000;">alt</span><span style="color: #0000ff;">=&#8221;3568df.com靓图&#8221;&nbsp;</span><span style="color: #ff0000;">src</span><span style="color: #0000ff;">=&#8221;http://www.aaa.com/upimg&nbsp;</span><span style="color: #ff0000;">/080330/120D1232295023X0.gif&#8221;&nbsp;mce_src</span><span style="color: #0000ff;">=&#8221;http://www.eee.com/upimg/080330&nbsp;</span><span style="color: #ff0000;">/120D1232295023X0.gif&#8221;&nbsp;width</span><span style="color: #0000ff;">=1&nbsp;</span><span style="color: #ff0000;">onclick</span><span style="color: #0000ff;">=&#8221;javascript:;&nbsp;</span><span style="color: #ff0000;">&#8221;&nbsp;&nbsp;onload</span><span style="color: #0000ff;">=&#8221;javascript:if(this.width</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">500){this.resized=true;&nbsp;this.style.width=500;}&#8221;&gt;sfsdfsdfasdfsadf</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">img&nbsp;</span><span style="color: #ff0000;">alt</span><span style="color: #0000ff;">=&#8221;3568df.com靓图&nbsp;</span><span style="color: #ff0000;">&#8221;&nbsp;src</span><span style="color: #0000ff;">=&#8221;http://www.3568.com/upimg/080330&nbsp;</span><span style="color: #ff0000;">/120D1232295023X0.gif&#8221;&nbsp;mce_src</span><span style="color: #0000ff;">=&#8221;http://www.ddd.com/upimg/080330&nbsp;</span><span style="color: #ff0000;">/120D1232295023X0.gif&#8221;&nbsp;width</span><span style="color: #0000ff;">=1&nbsp;</span><span style="color: #ff0000;">onclick</span><span style="color: #0000ff;">=&#8221;javascript:;&nbsp;</span><span style="color: #ff0000;">&#8221;&nbsp;&nbsp;onload</span><span style="color: #0000ff;">=&#8221;javascript:if(this.width</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">500){this.resized=true;&nbsp;this.style.width=500;}&#8221;&gt;sdfsadf</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">img&nbsp;</span><span style="color: #ff0000;">alt</span><span style="color: #0000ff;">=&#8221;3568df.com靓图&nbsp;</span><span style="color: #ff0000;">&#8221;&nbsp;src</span><span style="color: #0000ff;">=&#8221;http://www.xxx.com/upimg/080330/120D1232295023X0.gif&#8221;&nbsp;</span><span style="color: #ff0000;">mce_src</span><span style="color: #0000ff;">=&#8221;http://www.sss.com/upimg/080330/120D1232295023X0.gif&#8221;&nbsp;</span><span style="color: #ff0000;">width</span><span style="color: #0000ff;">=1&nbsp;</span><span style="color: #ff0000;">onclick</span><span style="color: #0000ff;">=&#8221;javascript:;&#8221;&nbsp;&nbsp;</span><span style="color: #ff0000;">onload</span><span style="color: #0000ff;">=&#8221;javascript:if(this.width</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">500){this.resized=true;this.style.width=500;}&#8221;&gt;sdfsdf<br></span></div>
</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>要把上面替换成形如：</span><span style="color: #000000;"><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">img&nbsp;</span><span style="color: #ff0000;">alt</span><span style="color: #0000ff;">=&#8221;我的信息&#8221;&nbsp;</span><span style="color: #ff0000;">src</span><span style="color: #0000ff;">=&#8221;http://www.xxx.com/upimg&nbsp;</span><span style="color: #ff0000;">/080330/120D1232295023X0.gif&#8221;&nbsp;mce_src</span><span style="color: #0000ff;">=&#8221;http://www.xxx.com/upimg/080330&nbsp;</span><span style="color: #ff0000;">/120D1232295023X0.gif&#8221;&nbsp;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;其中src=&#8221;http://www.xxx.com/upimg/080330&nbsp;/120D1232295023X0.gif&#8221;&nbsp;mce_src=&#8221;http://www.xxx.com/upimg/080330&nbsp;/120D1232295023X0.gif&#8221;这个地址要保留，因为图片用的都是源地址<br></span></div>
<br></span><span style="color: #008000;"></span><span style="color: #000000;"><br>方法大致是：先读取内容里的所以IMG标签，然后把每个IMG标签的SRC抽取出来，并且组合成自己的内容，最后进行替换。<br><br>preg_match_all就是我想要的函数，它能够把正则表达式匹配到的内容建立一个三维数组，你可以对它们进行遍历查找替换，不太了解的请查查手册，这里不作具体介绍。函数代码：<br><br></span><span style="color: #0000ff;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;replace(</span><span style="color: #800080;">$str</span><span style="color: #000000;">)<br>{<br>&nbsp;</span><span style="color: #008080;">preg_match_all</span><span style="color: #000000;">(&#8221;</span><span style="color: #000000;">/&lt;</span><span style="color: #000000;">img(</span><span style="color: #000000;">.*</span><span style="color: #000000;">)(src</span><span style="color: #000000;">=</span><span style="color: #000000;">\&#8221;[</span><span style="color: #000000;">^</span><span style="color: #000000;">\</span><span style="color: #000000;">"</span><span style="color: #000000;">]+\&#8221;)[^&gt;]+&gt;/isU&#8221;,&nbsp;$str,&nbsp;$arr);<br>&nbsp;for($i=0,$j=count($arr[0]);$i&lt;$j;$i++){<br>&nbsp;&nbsp;&nbsp;$str&nbsp;=&nbsp;str_replace($arr[0][$i],&#8221;&lt;img&nbsp;alt=\&#8221;我的信息&#8221;&nbsp;&#8220;.$arr[2][$i].&#8221;&nbsp;/&gt;&#8221;,$str);<br>&nbsp;}<br>&nbsp;return&nbsp;$str;<br>}&nbsp;</span></div>
<br></span></div>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-10-10 16:42 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/10/10/5874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何加速动态网站的MySQL索引分析和优化</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5817.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Mon, 22 Sep 2008 06:55:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5817.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5817.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5817.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5817.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">本文主要讲述了如何加速动态网站的MySQL索引分析和优化。
</font></p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;=""><strong>一、什么是索引？ </strong>
</font></p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">索
引用来快速地寻找那些具有特定值的记录，所有MySQL索引都以<span style="color: red;">B-树</span>的形式保存。如果没有索引，执行查询时MySQL必须从第一个记录开始扫描整个表的
所有记录，直至找到符合要求的记录。表里面的记录数量越多，这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引，MySQL无需扫描任何记录即
可迅速得到目标记录所在的位置。如果表有1000个记录，通过索引查找记录至少要比顺序扫描记录快100倍。 </font></p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">假设我们创建了一个名为people的表：
</font></p>
<p style="text-indent: 2em;">
</p>
<center><ccid_nobr>
</ccid_nobr></center>
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%">
    <script type="text/javascript"><!--
google_ad_client = "pub-3707276699544226";
//文章上部728*90
google_ad_slot =" "1325980008";
google_ad_width" = 728;
google_ad_height =" 90;
//--"></script>
    <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><script> window.google_render_ad(); </script>
</table>
<table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre><ccid_code>　 <br><br>　<br>CREATE TABLE people ( peopleid SMALLINT NOT NULL, <br>name CHAR(50) NOT NULL );</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
<font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">
</font>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">然
后，我们完全随机把1000个不同name值插入到people表。在数据文件中name列没有任何明确的次序。<span style="color: red;">如果我们创建了name列的索
引，MySQL将<span style="color: #0817ff;">在索引中排序name列,</span>对于索引中的每一项，MySQL在内部为它保存一个数据文件中实际记录所在位置的&#8220;指针&#8221;</span>。因此，如果我们要查
找name等于&#8220;Mike&#8221;记录的peopleid（SQL命令为&#8220;SELECT peopleid FROM people WHERE
name='Mike';&#8221;），MySQL能够在name的索引中查找&#8220;Mike&#8221;值，然后直接转到数据文件中相应的行，准确地返回该行的
peopleid（999）。在这个过程中，MySQL只需处理一个行就可以返回结果。如果没有&#8220;name&#8221;列的索引，MySQL要扫描数据文件中的所有
记录，即1000个记录！显然，需要MySQL处理的记录数量越少，则它完成任务的速度就越快。 </font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;=""><strong>二、索引的类型 </strong>
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">MySQL提供多种索引类型供选择：
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;=""><span style="color: #0817ff;">普通索引</span> :
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">这是最基本的索引类型，而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建：
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">创建索引，例如CREATE INDEX &lt;索引的名字&gt; ON tablename (列的列表)；
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">修改表，例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表)；
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">创建表的时候指定索引，例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) )；
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;=""><span style="color: #0817ff;">唯一性索引:</span>
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">这种索引和前面的&#8220;普通索引&#8221;基本相同，但有一个区别：<span style="color: #ff0000;">索引列的所有值</span>都只能出现一次，即必须唯一。唯一性索引可以用以下几种方式创建：
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">创建索引，例如CREATE UNIQUE INDEX &lt;索引的名字&gt; ON tablename (列的列表)；
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">修改表，例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表)；
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">创建表的时候指定索引，例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) )；
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em; color: #0817ff;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">主键 :
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">主
键是一种唯一性索引，但它必须指定为&#8220;PRIMARY
KEY&#8221;。如果你曾经用过AUTO_INCREMENT类型的列，你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定，例如&#8220;CREATE
TABLE tablename ( [...], PRIMARY KEY (列的列表) );
&#8221;。但是，我们也可以通过修改表的方式加入主键，例如&#8220;ALTER TABLE tablename ADD PRIMARY KEY (列的列表);
&#8221;。每个表只能有一个主键。 </font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em; color: #0010ff;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">全文索引:
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">MySQL
从3.23.23版开始支持全文索引和全文检索。在MySQL中，全文索引的索引类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型
的列上创建。它可以通过CREATE TABLE命令创建，也可以通过ALTER TABLE或CREATE
INDEX命令创建。对于大规模的数据集，通过ALTER TABLE（或者CREATE
INDEX）命令创建全文索引要比把记录插入带有全文索引的空表更快。本文下面的讨论不再涉及全文索引，要了解更多信息，请参见MySQL
documentation。 </font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;=""><strong>三、单列索引与多列索引 </strong>
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">索引可以是单列索引，也可以是多列索引。下面我们通过具体的例子来说明这两种索引的区别。假设有这样一个people表：
</font></p>
<p style="text-indent: 2em;">
</p>
<center><ccid_nobr>
<table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre><ccid_code>CREATE TABLE people ( peopleid <br>SMALLINT NOT NULL AUTO_INCREMENT,<br>firstname CHAR(50) NOT NULL, lastname CHAR(50) NOT NULL, <br>age SMALLINT NOT NULL,<br>townid SMALLINT NOT NULL, PRIMARY KEY (peopleid) );</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">下面是我们插入到这个people表的数据：
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">这个数据片段中有四个名字为&#8220;Mikes&#8221;的人（其中两个姓Sullivans，两个姓McConnells），有两个年龄为17岁的人，还有一个名字与众不同的Joe Smith。
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">这
个表的主要用途是根据指定的用户姓、名以及年龄返回相应的peopleid。例如，我们可能需要查找姓名为Mike
Sullivan、年龄17岁用户的peopleid（SQL命令为SELECT peopleid FROM people WHERE
firstname='Mike' AND lastname='Sullivan' AND
age=17；）。由于我们不想让MySQL每次执行查询就去扫描整个表，这里需要考虑运用索引。 </font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">首
先，我们可以考虑在单个列上创建索引，比如firstname、lastname或者age列。如果我们创建firstname列的索引（ALTER
TABLE people ADD INDEX firstname
(firstname)；），MySQL将通过这个索引迅速把搜索范围限制到那些firstname='Mike'的记录，然后再在这个&#8220;中间结果集&#8221;上
进行其他条件的搜索：它首先排除那些lastname不等于&#8220;Sullivan&#8221;的记录，然后排除那些age不等于17的记录。当记录满足所有搜索条件之
后，MySQL就返回最终的搜索结果。 </font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">由
于建立了firstname列的索引，与执行表的完全扫描相比，MySQL的效率提高了很多，但我们要求MySQL扫描的记录数量仍旧远远超过了实际所需
要的。虽然我们可以删除firstname列上的索引，再创建lastname或者age列的索引，但总地看来，不论在哪个列上创建索引搜索效率仍旧相
似。 </font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">为了提高搜索效率，我们需要考虑运用<span style="color: #2e10ff;">多列索引</span>(<span style="color: #2e10ff;">复合索引</span>)。如果为firstname、lastname和age这三个列创建一个多列索引，MySQL只需一次检索就能够找出正确的结果！下面是创建这个多列索引的SQL命令：
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;=""><span style="color: #ff0000;">ALTER TABLE people ADD INDEX fname_lname_age (<span style="color: #2e10ff;">firstname</span>,lastname,age)</span>；
</font></p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">由于索引文件以B-树格式保存，MySQL能够立即转到合适的firstname，然后再转到合适的lastname，最后转到合适的age。在没有扫描数据文件任何一个记录的情况下，MySQL就正确地找出了搜索的目标记录！
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">那
么，如果在firstname、lastname、age这三个列上分别创建单列索引，效果是否和创建一个firstname、lastname、age
的多列索引一样呢？答案是否定的，两者完全不同。<span style="color: #ff0000;">当我们执行查询的时候，MySQL只能使用一个索引</span>。<span style="color: #ff0000;">如果你有三个单列的索引，MySQL会试图选择一个
限制最严格的索引</span>。但是，即使是限制最严格的单列索引，它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;=""><strong>四、最左前缀 </strong>
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;=""><span style="color: #ff0000;">多
列索引还有另外一个优点</span>，它通过称为最左前缀（Leftmost
Prefixing）的概念体现出来。继续考虑前面的例子，现在我们有一个firstname、lastname、age列上的多列索引，我们称这个索引
为fname_lname_age。当搜索条件是以下各种列的组合时，MySQL将使用fname_lname_age索引： </font></p>
<p style="text-indent: 2em;">
</p>
<center><ccid_nobr>
<table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre><ccid_code>firstname，lastname，age<br>firstname，lastname<br>firstname</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">
</font>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">从另一方面理解，它相当于我们创建了(firstname，lastname，age)、(firstname，lastname)以及(firstname)这些列组合上的索引。下面这些查询都能够使用这个fname_lname_age索引：
</font></p>
<p style="text-indent: 2em;">
</p>
<center><ccid_nobr>
<table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre><ccid_code>　 　<br>SELECT peopleid FROM people <br>WHERE firstname='Mike' AND lastname='Sullivan' AND age='17'; <br>SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan'; <br>SELECT peopleid FROM people WHERE firstname='Mike'; <br><br>The following queries cannot use the index at all: <br><br>SELECT peopleid FROM people WHERE lastname='Sullivan'; <br>SELECT peopleid FROM people WHERE age='17'; <br>SELECT peopleid FROM people WHERE lastname='Sullivan' AND age='17';</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">
</font>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;=""><strong>五、选择索引列 </strong>
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">在性能优化过程中，选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列：<span style="color: #ff0000;">在WHERE子句中出现的列</span>，<span style="color: #ff0000;">在join子句中出现的列</span>。请看下面这个查询：
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;">
</p>
<center><ccid_nobr>
<table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre><ccid_code>SELECT age ## 不使用索引<br>FROM people WHERE firstname='Mike' ## 考虑使用索引<br>AND lastname='Sullivan' ## 考虑使用索引</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">
</font>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">这个查询与前面的查询略有不同，但仍属于简单查询。由于age是在SELECT部分被引用，MySQL不会用它来限制列选择操作。因此，对于这个查询来说，创建age列的索引没有什么必要。下面是一个更复杂的例子：
</font></p>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;">
</p>
<center><ccid_nobr>
<table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre><ccid_code>　 <br><br>　<br>SELECT people.age, ##不使用索引<br>town.name ##不使用索引<br>FROM people LEFT JOIN town ON<br>people.townid=town.townid ##考虑使用索引<br>WHERE firstname='Mike' ##考虑使用索引<br>AND lastname='Sullivan' ##考虑使用索引</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">
</font>
<p style="text-indent: 2em;">
</p>
<p style="text-indent: 2em;"><font id="" font_word="" class="htd" font-size:14px;="" font-family:宋体,="" verdana,="" arial,="" helvetica,="" sans-serif;="">与
前面的例子一样，由于firstname和lastname出现在WHERE子句中，因此这两个列仍旧有创建索引的必要。除此之外，由于town表的
townid列出现在join子句中，因此我们需要考虑创建该列的索引。那么，我们是否可以简单地认为应该索引WHERE子句和join子句中出现的每一
个列呢？差不多如此，但并不完全。我们还必须考虑到对列进行比较的操作符类型<span style="color: #ff0000; background-color: yellow;">。MySQL只有对以下操作符才使用索引：&lt;，&lt;=，=，&amp;
gt;，&gt;=，BETWEEN，IN，以及<span style="color: #0010ff;">某些时候的LIKE</span></span>。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符（%或者_）开头
的情形。例如，&#8220;SELECT peopleid FROM people WHERE firstname LIKE
'Mich%';&#8221;这个查询将使用索引，但&#8220;SELECT peopleid FROM people WHERE firstname LIKE
'%ike';&#8221;这个查询不会使用索引。</font></p>
<script type="text/javascript"><!--
google_ad_client = "pub-3707276699544226";
//300x250, 创建于 07-11-9
google_ad_slot =" "4047345889";
google_ad_width" = 300;
google_ad_height =" 250;
//--"></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><script> window.google_render_ad(); </script><iframe name="google_ads_frame" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3707276699544226&amp;dt=1222063348905&amp;lmt=1222063339&amp;prev_slotnames=7187470415%2C7187470415%2C1009886008%2C1325980008&amp;output=html&amp;slotname=4047345889&amp;correlator=1222063342610&amp;url=http%3A%2F%2Funix-cd.com%2Funixcd12%2Farticle_7014.html&amp;frm=0&amp;cc=24&amp;ga_vid=1554227699.1222062734&amp;ga_sid=1222062734&amp;ga_hid=383168390&amp;ga_fc=true&amp;flash=9.0.124&amp;u_h=1024&amp;u_w=1280&amp;u_ah=994&amp;u_aw=1280&amp;u_cd=32&amp;u_tz=480&amp;u_his=1&amp;u_nplug=7&amp;u_nmime=16" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" width="300" frameborder="0" height="250"></iframe><br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-09-22 14:55 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql Explain 详解</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5816.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Mon, 22 Sep 2008 03:19:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5816.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5816.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5816.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5816.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"><br><br><br>一.语法<br><br>explain&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">&nbsp;table_name&nbsp;</span><span style="color: #808080;">&gt;</span><span style="color: #000000;"><br><br>例如:&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">;<br><br>二.explain输出解释<br><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br></span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">.id<br>&nbsp;&nbsp;我的理解是SQL执行的顺利的标识,SQL从大到小的执行.<br><br>例如:<br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">)&nbsp;a)&nbsp;b;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">derived2</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;system&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;DERIVED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">derived3</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;system&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;DERIVED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br>很显然这条SQL是从里向外的执行,就是从id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">&nbsp;向上执行.<br><br></span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">.&nbsp;select_type<br><br>就是select类型,可以有以下几种<br><br>(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)&nbsp;SIMPLE<br>简单SELECT(不使用UNION或子查询等)&nbsp;例如:<br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br>(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">).&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;"><br><br>我的理解是最外层的select.例如:<br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">)&nbsp;a&nbsp;;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">derived2</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;system&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;DERIVED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br>(</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">).</span><span style="color: #0000ff;">UNION</span><span style="color: #000000;"><br><br>UNION中的第二个或后面的SELECT语句.例如<br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">union</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">all</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">UNION</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">ALL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">UNION</span><span style="color: #000000;">&nbsp;RESULT&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">union1,</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">ALL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br>(</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">).DEPENDENT&nbsp;</span><span style="color: #0000ff;">UNION</span><span style="color: #000000;"><br><br>UNION中的第二个或后面的SELECT语句，取决于外面的查询<br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">union</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">all</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3)&nbsp;&nbsp;;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">ALL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;DEPENDENT&nbsp;SUBQUERY&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;DEPENDENT&nbsp;</span><span style="color: #0000ff;">UNION</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;eq_ref&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;func&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">;&nbsp;Using&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">UNION</span><span style="color: #000000;">&nbsp;RESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">union2,</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">ALL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br>(</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">).</span><span style="color: #0000ff;">UNION</span><span style="color: #000000;">&nbsp;RESULT<br><br>UNION的结果。<br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">union</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">all</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">UNION</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">ALL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">UNION</span><span style="color: #000000;">&nbsp;RESULT&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">union1,</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">ALL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br>(</span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">).SUBQUERY<br><br>子查询中的第一个SELECT.<br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">&nbsp;)&nbsp;&nbsp;;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SUBQUERY&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br>(</span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">).&nbsp;&nbsp;DEPENDENT&nbsp;SUBQUERY<br><br>子查询中的第一个SELECT，取决于外面的查询<br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">&nbsp;)&nbsp;&nbsp;;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------------+-------+-------+-------------------+---------+---------+-------+------+--------------------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------------+-------+-------+-------------------+---------+---------+-------+------+--------------------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">;&nbsp;Using&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;DEPENDENT&nbsp;SUBQUERY&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+--------------------+-------+-------+-------------------+---------+---------+-------+------+--------------------------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br><br>(</span><span style="color: #800000; font-weight: bold;">7</span><span style="color: #000000;">).DERIVED<br><br>派生表的SELECT(FROM子句的子查询)<br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">)&nbsp;a&nbsp;;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">derived2</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;system&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;DERIVED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br><br></span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">.</span><span style="color: #0000ff;">table</span><span style="color: #000000;"><br><br>显示这一行的数据是关于哪张表的.<br>有时不是真实的表名字,看到的是derivedx(x是个数字,我的理解是第几步执行的结果)<br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">)&nbsp;a)&nbsp;b;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">derived2</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;system&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;DERIVED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">derived3</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;system&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;DERIVED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br></span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">.type<br><br>这列很重要,显示了连接使用了哪种类别,有无使用索引.<br>从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL<br><br>(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">).system<br><br>这是const联接类型的一个特例。表仅有一行满足条件.如下(t3表上的id是&nbsp;</span><span style="color: #0000ff;">primary</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">)<br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">)&nbsp;a&nbsp;;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">derived2</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;system&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;DERIVED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+------------+--------+-------------------+---------+---------+------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br>(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">).const<br><br>表最多有一个匹配行，它将在查询开始时被读取。因为仅有一行，在这行的列值可被优化器剩余部分认为是常数。const表很快，因为它们只读取一次！<br><br>const用于用常数值比较PRIMARY&nbsp;KEY或UNIQUE索引的所有部分时。在下面的查询中，tbl_name可以用于const表：<br></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;tbl_name&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;primary_key</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">；<br></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;tbl_name&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;primary_key_part1</span><span style="color: #808080;">=</span><span style="color: #000000;">1和&nbsp;primary_key_part2</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">；<br><br>例如:<br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br><br>(</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">).&nbsp;eq_ref<br><br>对于每个来自于前面的表的行组合，从该表中读取一行。这可能是最好的联接类型，除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY&nbsp;</span><span style="color: #0000ff;">KEY</span><span style="color: #000000;">。<br><br>eq_ref可以用于使用</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。<br><br>在下面的例子中，MySQL可以使用eq_ref联接来处理ref_tables：<br><br></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;ref_table,other_table<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;ref_table.key_column</span><span style="color: #808080;">=</span><span style="color: #000000;">other_table.</span><span style="color: #0000ff;">column</span><span style="color: #000000;">;<br><br></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;ref_table,other_table<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;ref_table.key_column_part1</span><span style="color: #808080;">=</span><span style="color: #000000;">other_table.</span><span style="color: #0000ff;">column</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">AND</span><span style="color: #000000;">&nbsp;ref_table.key_column_part2</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">;<br><br>例如<br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">create</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">unique</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;&nbsp;idx_t3_id&nbsp;</span><span style="color: #0000ff;">on</span><span style="color: #000000;">&nbsp;t3(id)&nbsp;;<br>Query&nbsp;OK,&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;rows&nbsp;affected&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.03</span><span style="color: #000000;">&nbsp;sec)<br>Records:&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;&nbsp;Duplicates:&nbsp;</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">&nbsp;&nbsp;Warnings:&nbsp;</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;"><br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3,t4&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;t3.id</span><span style="color: #808080;">=</span><span style="color: #000000;">t4.accountid;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t4&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">ALL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;eq_ref&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;dbatest.t4.accountid&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #000000;"><br>(</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">).ref<br><br>对于每个来自于前面的表的行组合，所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀，或如果键不是UNIQUE或PRIMARY&nbsp;</span><span style="color: #0000ff;">KEY</span><span style="color: #000000;">（换句话说，如果联接不能基于关键字选择单个行的话），则使用ref。如果使用的键仅仅匹配少量行，该联接类型是不错的。<br><br>ref可以用于使用</span><span style="color: #808080;">=</span><span style="color: #000000;">或</span><span style="color: #808080;">&lt;=&gt;</span><span style="color: #000000;">操作符的带索引的列。<br><br>在下面的例子中，MySQL可以使用ref联接来处理ref_tables：<br><br></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;ref_table&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;key_column</span><span style="color: #808080;">=</span><span style="color: #000000;">expr;<br><br></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;ref_table,other_table<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;ref_table.key_column</span><span style="color: #808080;">=</span><span style="color: #000000;">other_table.</span><span style="color: #0000ff;">column</span><span style="color: #000000;">;<br><br></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;ref_table,other_table<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;ref_table.key_column_part1</span><span style="color: #808080;">=</span><span style="color: #000000;">other_table.</span><span style="color: #0000ff;">column</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">AND</span><span style="color: #000000;">&nbsp;ref_table.key_column_part2</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">;<br><br>例如:<br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">drop</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;idx_t3_id&nbsp;</span><span style="color: #0000ff;">on</span><span style="color: #000000;">&nbsp;t3;<br>Query&nbsp;OK,&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;rows&nbsp;affected&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.03</span><span style="color: #000000;">&nbsp;sec)<br>Records:&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;&nbsp;Duplicates:&nbsp;</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">&nbsp;&nbsp;Warnings:&nbsp;</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;"><br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">create</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;idx_t3_id&nbsp;</span><span style="color: #0000ff;">on</span><span style="color: #000000;">&nbsp;t3(id)&nbsp;;<br>Query&nbsp;OK,&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;rows&nbsp;affected&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.04</span><span style="color: #000000;">&nbsp;sec)<br>Records:&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;&nbsp;Duplicates:&nbsp;</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">&nbsp;&nbsp;Warnings:&nbsp;</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;"><br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3,t4&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;t3.id</span><span style="color: #808080;">=</span><span style="color: #000000;">t4.accountid;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t4&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">ALL</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1000</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;dbatest.t4.accountid&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+</span><span style="color: #008080;"><br></span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.00</span><span style="color: #000000;">&nbsp;sec)<br><br>(</span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">).&nbsp;&nbsp;ref_or_null<br><br>该联接类型如同ref，但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。<br><br>在下面的例子中，MySQL可以使用ref_or_null联接来处理ref_tables：<br><br></span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;ref_table<br></span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;key_column</span><span style="color: #808080;">=</span><span style="color: #000000;">expr&nbsp;</span><span style="color: #808080;">OR</span><span style="color: #000000;">&nbsp;key_column&nbsp;</span><span style="color: #0000ff;">IS</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">;<br><br>(</span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">).&nbsp;index_merge<br><br>该联接类型表示使用了索引合并优化方法。在这种情况下，key列包含了使用的索引的清单，key_len包含了使用的索引的最长的关键元素。<br><br>例如:<br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t4&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">or</span><span style="color: #000000;">&nbsp;accountid</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">31754306</span><span style="color: #000000;">&nbsp;;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t4&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;index_merge&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;idx_t4_id,idx_t4_accountid&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;idx_t4_id,idx_t4_accountid&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">,</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">union</span><span style="color: #000000;">(idx_t4_id,idx_t4_accountid);&nbsp;Using&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+</span><span style="color: #008080;"><br></span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;row&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.00</span><span style="color: #000000;">&nbsp;sec)<br><br>(</span><span style="color: #800000; font-weight: bold;">7</span><span style="color: #000000;">).&nbsp;unique_subquery<br><br>该类型替换了下面形式的IN子查询的ref：<br><br>value&nbsp;</span><span style="color: #808080;">IN</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;primary_key&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;single_table&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;some_expr)<br>unique_subquery是一个索引查找函数，可以完全替换子查询，效率更高。<br><br>(</span><span style="color: #800000; font-weight: bold;">8</span><span style="color: #000000;">).index_subquery<br><br>该联接类型类似于unique_subquery。可以替换IN子查询，但只适合下列形式的子查询中的非唯一索引：<br><br>value&nbsp;</span><span style="color: #808080;">IN</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;key_column&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;single_table&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;some_expr)<br><br>(</span><span style="color: #800000; font-weight: bold;">9</span><span style="color: #000000;">).range<br><br>只检索给定范围的行，使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。<br><br>当使用</span><span style="color: #808080;">=</span><span style="color: #000000;">、</span><span style="color: #808080;">&lt;&gt;</span><span style="color: #000000;">、</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">、</span><span style="color: #808080;">&gt;=</span><span style="color: #000000;">、</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">、</span><span style="color: #808080;">&lt;=</span><span style="color: #000000;">、</span><span style="color: #0000ff;">IS</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">、</span><span style="color: #808080;">&lt;=&gt;</span><span style="color: #000000;">、BETWEEN或者IN操作符，用常量比较关键字列时，可以使用range<br><br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;explain&nbsp;</span><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;t3&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952602</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">or</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">3952603</span><span style="color: #000000;">&nbsp;;<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;t3&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;range&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">,idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;idx_t3_id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+</span><span style="color: #008080;"><br></span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;row&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.02</span><span style="color: #000000;">&nbsp;sec)<br><br>(</span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">).</span><span style="color: #0000ff;">index</span><span style="color: #000000;"><br><br>该联接类型与ALL相同，除了只有索引树被扫描。这通常比ALL快，因为索引文件通常比数据文件小。<br><br>当查询只使用作为单索引一部分的列时，MySQL可以使用该联接类型。<br><br>(</span><span style="color: #800000; font-weight: bold;">11</span><span style="color: #000000;">).&nbsp;</span><span style="color: #808080;">ALL</span><span style="color: #000000;"><br><br>对于每个来自于先前的表的行组合，进行完整的表扫描。如果表是第一个没标记const的表，这通常不好，并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL，使得行能基于前面的表中的常数值或列值被检索出。<br><br><br></span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">.possible_keys<br><br>possible_keys列指出MySQL能使用哪个索引在该表中找到行。注意，该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。<br><br>如果该列是NULL，则没有相关的索引。在这种情况下，可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样，创造一个适当的索引并且再次用EXPLAIN检查查询<br><br></span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;"><br><br>key列显示MySQL实际决定使用的键（索引）。如果没有选择索引，键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引，在查询中使用FORCE&nbsp;</span><span style="color: #0000ff;">INDEX</span><span style="color: #000000;">、</span><span style="color: #0000ff;">USE</span><span style="color: #000000;">&nbsp;INDEX或者IGNORE&nbsp;</span><span style="color: #0000ff;">INDEX</span><span style="color: #000000;">。<br><br></span><span style="color: #800000; font-weight: bold;">7</span><span style="color: #000000;">.key_len<br><br>key_len列显示MySQL决定使用的键长度。如果键是NULL，则长度为NULL。<br>使用的索引的长度。在不损失精确性的情况下，长度越短越好<br><br></span><span style="color: #800000; font-weight: bold;">8</span><span style="color: #000000;">.&nbsp;ref<br><br>ref列显示使用哪个列或常数与key一起从表中选择行。<br><br></span><span style="color: #800000; font-weight: bold;">9</span><span style="color: #000000;">.&nbsp;rows<br><br>rows列显示MySQL认为它执行查询时必须检查的行数。<br><br></span><span style="color: #800000; font-weight: bold;">10</span><span style="color: #000000;">.&nbsp;Extra<br><br>该列包含MySQL解决查询的详细信息,下面详细.<br><br>(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">).</span><span style="color: #0000ff;">Distinct</span><span style="color: #000000;"><br>一旦MYSQL找到了与行相联合匹配的行，就不再搜索了<br><br>(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">).</span><span style="color: #808080;">Not</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">exists</span><span style="color: #000000;"><br>MYSQL优化了LEFT&nbsp;</span><span style="color: #0000ff;">JOIN</span><span style="color: #000000;">，一旦它找到了匹配LEFT&nbsp;JOIN标准的行，<br><br>就不再搜索了<br><br>(</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">).Range&nbsp;checked&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;each<br><br>Record（</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;map:#）<br>没有找到理想的索引，因此对于从前面表中来的每一个行组合，MYSQL检查使用哪个索引，并用它来从表中返回行。这是使用索引的最慢的连接之一<br><br>(</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">).Using&nbsp;filesort<br>看到这个的时候，查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行<br><br>(</span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">).Using&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;"><br>列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的，这发生在对表的全部的请求列都是同一个索引的部分的时候<br><br>(</span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">).Using&nbsp;</span><span style="color: #0000ff;">temporary</span><span style="color: #000000;"><br>看到这个的时候，查询需要优化了。这里，MYSQL需要创建一个临时表来存储结果，这通常发生在对不同的列集进行ORDER&nbsp;BY上，而不是GROUP&nbsp;BY上<br><br>(</span><span style="color: #800000; font-weight: bold;">7</span><span style="color: #000000;">).Using&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;"><br>使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行，并且连接类型ALL或index，这就会发生，或者是查询有问题</span></div>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-09-22 11:19 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优化MySQL数据库查询(索引)</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5815.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Mon, 22 Sep 2008 03:18:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5815.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5815.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5815.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5815.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"><br>任何一位数据库程序员都会有这样的体会：高通信量的数据库驱动程序中，一条糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响，其不仅消耗掉更多的数据库时间，且它将对其他应用组件产生影响。<br><br>　　如同其它学科，优化查询性能很大程度上决定于开发者的直觉。幸运的是，像MySQL这样的数据库自带有一些协助工具。本文简要讨论诸多工具之三种：使用索引，使用EXPLAIN分析查询以及调整MySQL的内部配置。<br><br>　　</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">:&nbsp;使用索引<br><br>　　MySQL允许对数据库表进行索引，以此能迅速查找记录，而无需一开始就扫描整个表，由此显著地加快查询速度。每个表最多可以做到16个索引，此外MySQL还支持多列索引及全文检索。<br><br>　　给表添加一个索引非常简单，只需调用一个CREATE&nbsp;INDEX命令并为索引指定它的域即可。列表A给出了一个例子：<br><br>　　列表&nbsp;A<br><br>　　mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">CREATE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">INDEX</span><span style="color: #000000;">&nbsp;idx_username&nbsp;</span><span style="color: #0000ff;">ON</span><span style="color: #000000;">&nbsp;users(username);<br>　　Query&nbsp;OK,&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;row&nbsp;affected&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.15</span><span style="color: #000000;">&nbsp;sec)<br>　　Records:&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;Duplicates:&nbsp;</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">&nbsp;Warnings:&nbsp;</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;"><br><br><br>　　这里，对users表的username域做索引，以确保在<span style="color: red;">WHERE或者HAVING</span>子句中引用这一域的SELECT查询语句运行速度比没有添加索引时要快。通过SHOW&nbsp;INDEX命令可以查看索引已被创建(列表B)。<br><br>　　列表&nbsp;B<br><br>　　mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;SHOW&nbsp;</span><span style="color: #0000ff;">INDEX</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;users;<br>　　</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">Table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Non_unique&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Key_name&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Seq_in_index&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Column_name&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Collation&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Cardinality&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Sub_part&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Packed&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">Null</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Index_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Comment&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br>　　</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;users&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;idx_username&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;username&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;A&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;YES&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;BTREE&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br>　　</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;row&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.00</span><span style="color: #000000;">&nbsp;sec)<br><br><br>　　值得注意的是：索引就像一把双刃剑。对表的每一域做索引通常没有必要，且很可能导致运行速度减慢，因为向表中插入或修改数据时，MySQL不得不每次都为这些额外的工作重新建立索引。另一方面，避免对表的每一域做索引同样不是一个非常好的主意，因为在提高插入记录的速度时，导致查询操作的速度减慢。这就需要找到一个平衡点，比如在设计索引系统时，考虑表的主要功能(数据修复及编辑)不失为一种明智的选择。<br><br>　　</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">:&nbsp;优化查询性能<br><br>　　<span style="color: red;">在分析查询性能时，考虑EXPLAIN关键字同样很管用。</span>EXPLAIN关键字一般放在SELECT查询语句的前面，用于描述MySQL如何执行查询操作、以及MySQL成功返回结果集需要执行的行数。下面的一个简单例子可以说明(列表C)这一过程：<br><br>　　列表&nbsp;C<br><br>　　mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;EXPLAIN&nbsp;</span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;city.name,&nbsp;city.district&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;city,&nbsp;country&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;city.countrycode&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;country.code&nbsp;</span><span style="color: #808080;">AND</span><span style="color: #000000;">&nbsp;country.code&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">IND</span><span style="color: #ff0000;">'</span><span style="color: #000000;">;<br><br>　　</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br><br>　　</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;country&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000; background-color: yellow;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br>　　</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;city&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">ALL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">NULL</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold; background-color: yellow;">4079</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br><br><br>　　</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.00</span><span style="color: #000000;">&nbsp;sec)这里查询是基于两个表连接。EXPLAIN关键字描述了MySQL是如何处理连接这两个表。必须清楚的是，当前设计要求MySQL处理的是&nbsp;country表中的一条记录以及city表中的整个4019条记录。这就意味着，还可使用其他的优化技巧改进其查询方法。例如，给city表添加如下索引(列表D)：<br><br>　　列表&nbsp;D<br><br>　　mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">CREATE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">INDEX</span><span style="color: #000000;">&nbsp;idx_ccode&nbsp;</span><span style="color: #0000ff;">ON</span><span style="color: #000000;">&nbsp;city(countrycode);<br>　　Query&nbsp;OK,&nbsp;</span><span style="color: #800000; font-weight: bold;">4079</span><span style="color: #000000;">&nbsp;rows&nbsp;affected&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.15</span><span style="color: #000000;">&nbsp;sec)<br>　　Records:&nbsp;</span><span style="color: #800000; font-weight: bold;">4079</span><span style="color: #000000;">&nbsp;Duplicates:&nbsp;</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">&nbsp;Warnings:&nbsp;</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;"><br><br><br>　　现在，当我们重新使用EXPLAIN关键字进行查询时，我们可以看到一个显著的改进(列表E)：<br><br>　　列表&nbsp;E<br><br>以下是引用片段：<br>　　mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;EXPLAIN&nbsp;</span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;city.name,&nbsp;city.district&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;city,&nbsp;country&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;city.countrycode&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;country.code&nbsp;</span><span style="color: #808080;">AND</span><span style="color: #000000;">&nbsp;country.code&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">IND</span><span style="color: #ff0000;">'</span><span style="color: #000000;">;<br>　　</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;id&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;select_type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;type&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;possible_keys&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">key</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;key_len&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Extra&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br>　　</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;country&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">PRIMARY</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br>　　</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;SIMPLE&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;city&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;ref&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;idx_ccode&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;idx_ccode&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;const&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">333</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;Using&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br>　　</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;rows&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;(</span><span style="color: #800000; font-weight: bold;">0.01</span><span style="color: #000000;">&nbsp;sec)<br><br><br>　　在这个例子中，MySQL现在只需要扫描city表中的333条记录就可产生一个结果集，其扫描记录数几乎减少了90</span><span style="color: #808080;">%</span><span style="color: #000000;">!自然，数据库资源的查询速度更快，效率更高。<br><br><br></span></div>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-09-22 11:18 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> MySQL查询优化程序</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5813.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Mon, 22 Sep 2008 02:17:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5813.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5813.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5813.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5813.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"></span></div>
&nbsp;&nbsp;&nbsp; 在发布一个选择行的查询时，
MySQL进行分析，看是否能够对它进行优化，使它执行更快。本文我们将研究查询优化程序怎样工作。更详细的信息，可参阅MySQL参考指南中的
&#8220;Getting Maximum Performance from
MySQL&#8221;，本文描述了MySQL采用的各种优化措施。（http://www.mysql.com/ 处的MySQL联机参考指南在不断地更新。）
<br><br>&nbsp;&nbsp;&nbsp; MySQL查询优化程序利用了索引。当然，它也利用了其他信息。例如，如果发布下列查询，MySQL将非常快地执行它，不管相应的表有多大：
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">SELECT * FROM tb1_name WHERE 1= 0 <img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top"></div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 在此情形中，MySQL考察WHERE 子句，如果认识到不可能有满足该查询的行，就不会对该表进行搜索。可利用EXPLAIN
语句知道这一点，EXPLAIN 语句要求MySQL显示某些有关它应该执行一条SELECT 查询，而实际没有执行的信息。为了使用E X P L
A I N，只需要SELECT 语句前放置EXPLAIN 即可，如下所示： </p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">EXPLAIN SELECT * FROM tb1_name WHERE 1= 0 </div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 通常，EXPLAIN 返回的信息比这个多，包括将用来扫描表的索引、将要使用的连接类型以及需要在每个表中扫描的行数估计等等。 <br><br>&nbsp;&nbsp;&nbsp; <strong> 优化程序怎样工作</strong>  <br><br>&nbsp;&nbsp;&nbsp;
MySQL查询优化程序有几个目标，但其主要目标是尽量利用索引，而且尽量使用最具有限制性的索引以排除尽可能多的行。这样做可能会适得其反，因为发布一
条SELECT
语句的目的是寻找行，而不是拒绝它们。优化程序这样工作的原因是从要考虑的行中排除行越快，那么找到确实符合给出标准的行就越快。如果能够首先进行最具限
制性的测试，则查询可以进行得更快。假如有一个测试两列的查询，每列上都有一个索引： </p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">WHERE coll = "some value" AND col2 = "some other value" </div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 还假定，与col1上的测试相符的有900 行，与col2 上的测试相符的有300 行，而两个测试都通过的有30
行。如果首先测试c o l 1，必须检查900 行以找到也与col2 值相符的30 行。那么测试中有870 将失败。如果首先测试c o l
2，要找到也与col1值相符的30 行，只需检查300 行。测试中有失败270 次，这样所涉及的计算较少，磁盘I/O
也较少。<span style="color: red;">遵循下列准则，有助于优化程序利用索引</span>： <br><br>&nbsp;&nbsp;&nbsp; <span style="color: red;">1
,比较具有相同类型的列。</span>在比较中利用索引列时，应该使用那些类型相同的列。例如，CHAR(10) 被视为与CHAR(10)
或VARCHAR(10) 相同，但不同于CHAR(12) 和VARCHAR( 12 )。INT 与BIGINT 不同。在MySQL3.23
版以前，要求使用相同类型的列，否则列上的索引将不起作用。自3.23
版后，不严格要求这样做，但相同的列类型比不同类型提供更好的性能。如果所比较的两列类型不同，可使用ALTER
TABLE语句修改其中之一使它们的类型相配。 <br><br>&nbsp;&nbsp;&nbsp; <span style="color: red;">2,
比较中应尽量使索引列独立</span>。如果在<span style="color: red;">函数调用或算术表达式中使用一个列，则MySQL不能使用这样的索引</span>，因为它必须对每行计算表达式的值。有时，这是不可
避免的，但很多时候，可以重新编写只取索引列本身的查询。下面的WHERE 子句说明了怎样进行这项工作。第一行中，优化程序将简化表达式4/2
为值2，然后使用my_col 上的索引快速地找到小于2 的值。而在第二个表达式中，MySQL必须检索出每行的my_col
值，乘以2，然后将结果与4 比较。没索引可用，因为列中的每个值都要检索，以便能对左边的表达式求值： </p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">WHERE my_col &lt; 4/2<br><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">WHERE my_col * 2 &lt; 4 </div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 让我们考虑另一个例子。假如有一个索引列date _ c o l。如果发布如下的查询，<span style="color: red;">相应的索引未被使用</span>： </p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top"><span style="color: red;">SELECT * FROM my_tb1WHERE YEAR(date_col) &lt; 1990</span> </div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 其中表达式并不将索引列与1990 比较，而是将从列值计算出的值用于比较，而且必须计算每行的这个值。结果是， date_col 上的索引不可能得到使用。怎样解决？使用一个文字日期即可，这时将会使用date_col 上的索引： </p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">WHERE date_col &lt; "1990-01-01" </div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 但是假如没有特定的日期值，那么可能会对找到具有出现在距今一定天数内的日期的记录感兴趣。有几种方法来编写这样的查询，但并非所有方法都很好。三种可能的方法如下:&nbsp;</p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">where TO_DAYS(date_col) -TO_DAYS(cunnent_date)&lt;cutoff.<br><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top"> where TO_DAYS(date_col) &lt;cutoff+TO_DAYS(cunnent_date)<br><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top"> where date_col&lt;DATE_ADD(cunnent_date,INTERVL cutoff DAY)</div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 其中第一行不能利用索引， 因为必须为每行检索列， 以便能够计算TO _ DAYS(date_col) 的值。第二行要好一些。c
ut o ff 和TO _ DAY S ( CURRENT _ DATE)
两者都是常量，因此比较表达式的右边可在查询处理前由优化程序一次计算出来，而不是每行计算一次。但date_col
列仍然出现在一个函数调用中，因此，没有使用索引。<span style="color: red;">第三行是最好的方法</span>。比较表达式的右边可在执行查询前作为常量一次计算出来，但现在其值是一个日期。这
个值可直接与date_col 的值进行比较，不再需要转换为天数，<span style="color: red;">可以利用索引。 </span><br><br>&nbsp;&nbsp;&nbsp; ■ 在LIKE 模式的起始处不要使用通配符。有时，有的人会用下列形式的WHERE 子句来搜索串： </p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">WHERE col_name LIKE "%string%" </div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 如果希望找到s t r i n g，不管它出现在列中任何位置，那么这样做是对的。但不要出于习惯在串的两边加&#8220;
%&#8221;。如果实际要查找的只是出现在列的开始处的串，则不应该要第一个&#8220;%&#8221;号。例如，如果在一个包含姓的列中查找&#8220; M a
c&#8221;起始的姓，应该编写如下的WHERE 子句： </p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">WHERE last_name LIKE "Mac%" </div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 优化程序考虑模式中的开始的文字部分，然后利用索引找到相符合的行。不过宁可写成如下的表达式，它允许使用last_name 上的索引： </p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">WHERE last_name &gt;= "Mac" AND last_name &lt; "Mad"<br><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top"></div>
<span style="color: red;">(这个写法比上面还好些)</span><br></pre>
</div>
&nbsp;&nbsp;&nbsp; 这种优化对使用REGEXP 操作符的模式匹配不起作用。 <br><br>&nbsp;&nbsp;&nbsp; ■
帮助优化程序更好地评估索引的有效性。缺省时，如果将索引列中的值与常量进行比较，优化程序将假定键字是均匀地分布在索引中的。优化程序还将对索引进行一
个快速的检查，以估计在确定相应的索引是否应该用于常量的比较时要使用多少条目。可利用myisamchk 或isamchk 的--analyze
选项给优化程序提供更好的信息，以便分析键值的分布。myisamchk 用于MyISAM 表，isamchk 用于ISAM
表。为了完成键值分析，必须能够登录到MySQL服务器主机中，而且必须对表文件具有写访问权限。 <br><br>&nbsp;&nbsp;&nbsp; ■ 利用EXPLAIN
检验优化程序操作。检查用于查询中的索引是否能很快地排除行。如果不能，那么应该试一下利用STRAIGHT_JOIN
强制按特定次序使用表来完成一个连接。查询的执行方式不那么显然；MySQL可能会有很多理由不以您认为最好的次序使用索引。 <br><br>&nbsp;&nbsp;&nbsp;
■
测试查询的其他形式，而且不止一次地运行它们。在测试一个查询的其他形式时，应该每种方法运行几次。如果对两个不同方法中的每种只运行查询一次，通常会发
现第二个查询更快，因为来自第一个查询的信息在磁盘高速缓存中，不需要实际从磁盘上读出。还应该尽量在系统负载相对平稳的时候运行查询，以避免受系统中其
他活动的影响。
<br> <strong> 忽略优化 <br></strong> <br>&nbsp;&nbsp;&nbsp; 这可能听起来有点奇怪，但在以下情况中，要废除MySQL的优化功能： <br><br>&nbsp;&nbsp;&nbsp; 强迫MySQL慢慢地删除表的内容。在需要完全删空一个表时，利用无WHERE 子句的DELETE 语句删除整个表的内容是最快的，如下所示：
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">DELETE FROM tb1_name </div>
<br></pre>
</div>
&nbsp;&nbsp;&nbsp; MySQL对这种特殊情况的DELETE 进行优化；它利用表信息文件中的表说明从头开始创建空数据文件和索引文件。这种优化使DELETE 操作极快，因为MySQL无需单独地删除每一行。但在某些情况下，这样做会产生一些不必要的负作用： <br><br>&nbsp;&nbsp;&nbsp; ■ MySQL报告所涉及的行数为零，即使表不为空也是如此。很多时候这没有关系（虽然，如果事先没有思想准备，会感到困惑不解），但对于那些确实需要知道真实行数的应用程序来说，这是不恰当的。 <br>&nbsp;&nbsp;&nbsp;
■ 如果表含有一个AUTO_INCREMENT 列，则该列的顺序编号会以1从头开始。这是真实的事情，即使在MySQL3.23
中对AUTO_INCREMENT 的处理进行了改进后也是这样。关于这个改进的介绍请参阅第2章中的&#8220;使用序列&#8221;小节。可增加WHERE 1&gt;
0 子句对DELETE 语句&#8220;不优化&#8221;。
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">DELETE FROM tb1_name WHERE 1&gt; 0 <img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top"></div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 这迫使MySQL进行逐行的删除。相应的查询执行要慢得多，但将返回真正删除的行数。它还将保持当前的AUTO_INCREMENT 序列的编号，不过只对MyISAM 表（MySQL3.23 以上的版本可用）有效。而对于ISAM 表，序列仍将重置。&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; ■ 避免更新循环不终止。如果更新一个索引列，如果该列用于WHERE 子句且更新将索引值移入至今尚未出超的取值范围内时，有可能对所更新的行进行不终止的更新。假如表my_tbl 有一个索引了的整数列key _ c o l。下列的查询会产生问题：</p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">update my_tbl  set  key_col=key_col+1 where key_col&gt;0</div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这个问题的解决方法是在WHERE 子句中将key_col 用于一个表达式，使MySQL不能使用索引： </p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">update my_tbl  set  key_col=key_col+1 where key_col+0&gt;0</div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 实际上，还有另外的方法，即升级到MySQL3.23.2 或更高的版本，它们已经解决了这样的问题。 <br><br>&nbsp;&nbsp;&nbsp;
以随机次序检索结果。自MySQL3.23.3 以来，可使用ORDER BY RAND( )
随机地对结果进行排序。另一技术对MySQL更旧的版本很有用处，那就是选择一个随机数列，然后在该列上进行排序。但是，如果按如下编写查询，优化程序将
会让您的愿望落空：</p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top"> select ...,RAND( )  as rand_col from ... order by  rand_col</div>
<br></pre>
</div>
<p>&nbsp;&nbsp;&nbsp; 这里的问题是MySQL认为该列是一个函数调用，将认为相应的列值是一个常数，而对ORDER BY 子句进行优化，使此查询失效。可在表达式中引用某个表列来蒙骗优化程序。例如，如果表中有一个名为age 的列，可编写如下查询： </p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!--
code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><img src="http://219.232.114.72/Images/OutliningIndicators/None.gif" alt="" align="top">select ...,age*0+RAND( )  as rand_col from ... order by  rand_col</div>
<br></pre>
</div>
&nbsp;&nbsp;&nbsp; 忽略优化程序的表连接次序。可利用STRIGHT_JOIN
强迫优化程序以特定的次序使用表。如果这样做，应该规定表的次序，使第一个表为从中选择的行数最少的表。（如果不能肯定哪个表满足这个要求，可将行数最多
的表作为第一个表。）换句话说，应尽量规定表的次序，使最有限制性的选择先出现。排除可能的候选行越早，查询执行得就越快。要保证测试相应的查询两次；可
能会有某些原因使优化程序不以您所想像的方式对表进行连接，并且STRAIGHT_JOIN 也可能实际上不起作用。
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-09-22 10:17 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql全文索引</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5812.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Mon, 22 Sep 2008 01:37:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5812.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5812.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5812.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5812.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">MYSQL的一个很有用的特性是使用全文索引(FULLTEXT&nbsp;</span><span style="color: #0000ff;">index</span><span style="color: #000000;">)查找文本的能力.目前只有使用MyISAM类型表的时候有效(MyISAM是默认的表类型,如果你不知道使用的是什么类型的表,那很可能就是&nbsp;MyISAM).全文索引可以建立在TEXT,CHAR或者VARCHAR类型的字段,或者字段组合上.我们将建立一个简单的表用来解释各种特性.<br>简单用法(MATCH()函数)对3.23.23以后的版本有效,复杂的用法(</span><span style="color: #808080;">IN</span><span style="color: #000000;">&nbsp;BOOLEAN&nbsp;MODE修饰语)对4以后的版本有效,本文的第一部分着重简单用法,第二部分讲复杂用法.<br>一个简单的表<br>我们将在整个过程中使用下面的表.<br></span><span style="color: #0000ff;">CREATE</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;fulltext_sample(copy&nbsp;</span><span style="color: #000000; font-weight: bold;">TEXT</span><span style="color: #000000;">,FULLTEXT(copy))&nbsp;TYPE</span><span style="color: #808080;">=</span><span style="color: #000000;">MyISAM;<br>如果你没有把默认的表类型设置成MyISAM以外的类型那么TYPE</span><span style="color: #808080;">=</span><span style="color: #000000;">MyISAM可以省略.建表之后,向其中填充一些数据,例如:<br></span><span style="color: #0000ff;">INSERT</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">INTO</span><span style="color: #000000;">&nbsp;fulltext_sample&nbsp;</span><span style="color: #0000ff;">VALUES</span><span style="color: #000000;"><br>(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">It&nbsp;appears&nbsp;good&nbsp;from&nbsp;here</span><span style="color: #ff0000;">'</span><span style="color: #000000;">),<br>(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">The&nbsp;here&nbsp;and&nbsp;the&nbsp;past</span><span style="color: #ff0000;">'</span><span style="color: #000000;">),<br>(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">Why&nbsp;are&nbsp;we&nbsp;hear</span><span style="color: #ff0000;">'</span><span style="color: #000000;">),<br>(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">An&nbsp;all-out&nbsp;alert</span><span style="color: #ff0000;">'</span><span style="color: #000000;">),<br>(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">All&nbsp;you&nbsp;need&nbsp;is&nbsp;love</span><span style="color: #ff0000;">'</span><span style="color: #000000;">),<br>(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">A&nbsp;good&nbsp;alert</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br>如果你已经建立好了一个表,你可以使用ALTER&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">(就像CREATE&nbsp;INDEX语句一样)语句添加一个全文索引,例如:<br></span><span style="color: #0000ff;">ALTER</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">TABLE</span><span style="color: #000000;">&nbsp;fulltext_sample&nbsp;</span><span style="color: #0000ff;">ADD</span><span style="color: #000000;">&nbsp;FULLTEXT(copy)<br>查找文本<br>全文索引搜索的语法很简单,你只要MATCH字段,AGAINST你要查找的文本,例如:<br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;fulltext_sample&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;MATCH(copy)&nbsp;AGAINST(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">love</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--------------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;copy&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--------------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">All</span><span style="color: #000000;">&nbsp;you&nbsp;need&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;love&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--------------------+</span><span style="color: #008080;"><br></span><span style="color: #000000;">在全文索引上进行搜索是不区分大小写的,因此下面的语句也可以正常运行:<br>mysql</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">SELECT</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">FROM</span><span style="color: #000000;">&nbsp;fulltext_sample&nbsp;</span><span style="color: #0000ff;">WHERE</span><span style="color: #000000;">&nbsp;MATCH(copy)&nbsp;AGAINST(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">LOVE</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--------------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;copy&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--------------------+</span><span style="color: #008080;"><br></span><span style="color: #808080;">|</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">All</span><span style="color: #000000;">&nbsp;you&nbsp;need&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;love&nbsp;</span><span style="color: #808080;">|</span><span style="color: #000000;"><br></span><span style="color: #808080;">+</span><span style="color: #008080;">--</span><span style="color: #008080;">--------------------+</span><span style="color: #008080;"><br></span><span style="color: #000000;">全文索引通常用来搜索自然语言文本,例如报纸文章,网页内容等等.因此MySQL为这类搜索添加了很多特性.MySQL不索引任何长度小于等于3的文本,&nbsp;也不索引有50</span><span style="color: #808080;">%</span><span style="color: #000000;">机会出现的单词.这意味着如果你的表少于2条记录,基于全文索引的搜索不会返回任何东西.将来,MySQL会使这项功能更灵活,但是现在它应该可以适合大部分自然语言的使用.如果你的数据库中的大部分记录都包含&#8221;music&#8221;,你很可能不希望返回这些记录,你可以使用IN&nbsp;BOOLEAN&nbsp;MODE修饰符来获得50</span><span style="color: #808080;">%</span><span style="color: #000000;">左右的阀值,见本文第二部分.<br>结果将按照关联性从高到底的顺序返回.<br><br><br>主要特性<br>下面是标准的全文索引搜索的主要特性:<br></span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">.排除重复词语<br></span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">.排除长度小于4的词语<br></span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">.排除在多于一半记录中出现的词语(就是说只要要有3条记录)<br></span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">.带连字符的词语被认为两个词语<br></span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">.结果按照关联度降序返回<br></span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">.忽略列表中的词语也被从搜索结果中排除.忽略列表基于普通的英文单词,因此如果你的数据用作不同的目的,你可能希望改变忽略列表.不幸的是,这样作并不容易.你需要编辑文件myisam</span><span style="color: #808080;">/</span><span style="color: #000000;">ft_static.c,重新编辑MySQL,并重建索引!这里有一个忽略列表.注意,这些在不同的版本里有所更改.<br>忽略列表<br>"a",&nbsp;"a</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">s",&nbsp;"able",&nbsp;"about",&nbsp;"above",&nbsp;"according",&nbsp;"accordingly",&nbsp;"across",&nbsp;"actually",&nbsp;"after",&nbsp;"afterwards",&nbsp;"again",&nbsp;"against",&nbsp;"ain</span><span style="color: #ff0000;">'</span><span style="color: #000000;">t",&nbsp;"</span><span style="color: #808080;">all</span><span style="color: #000000;">",&nbsp;"allow",&nbsp;"allows",&nbsp;"almost",&nbsp;"alone",&nbsp;"along",&nbsp;"already",&nbsp;"also",&nbsp;"although",&nbsp;"always",&nbsp;"am",&nbsp;"among",&nbsp;"amongst",&nbsp;"an",&nbsp;"</span><span style="color: #808080;">and</span><span style="color: #000000;">",&nbsp;"another",&nbsp;"</span><span style="color: #808080;">any</span><span style="color: #000000;">",&nbsp;"anybody",&nbsp;"anyhow",&nbsp;"anyone",&nbsp;"anything",&nbsp;"anyway",&nbsp;"anyways",&nbsp;"anywhere",&nbsp;"apart",&nbsp;"appear",&nbsp;"appreciate",&nbsp;"appropriate",&nbsp;"are",&nbsp;"aren</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">t",&nbsp;"around",&nbsp;"as",&nbsp;"aside",&nbsp;"ask",&nbsp;"asking",&nbsp;"associated",&nbsp;"at",&nbsp;"available",&nbsp;"away",&nbsp;"awfully",&nbsp;"b",&nbsp;"be",&nbsp;"became",&nbsp;"because",&nbsp;"become",&nbsp;"becomes",&nbsp;"becoming",&nbsp;"been",&nbsp;"before",&nbsp;"beforehand",&nbsp;"behind",&nbsp;"being",&nbsp;"believe",&nbsp;"below",&nbsp;"beside",&nbsp;"besides",&nbsp;"best",&nbsp;"better",&nbsp;"between",&nbsp;"beyond",&nbsp;"both",&nbsp;"brief",&nbsp;"but",&nbsp;"by",&nbsp;"c",&nbsp;"c</span><span style="color: #ff0000;">'</span><span style="color: #000000;">mon",&nbsp;"c</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">s",&nbsp;"came",&nbsp;"can",&nbsp;"can</span><span style="color: #ff0000;">'</span><span style="color: #000000;">t",&nbsp;"cannot",&nbsp;"cant",&nbsp;"cause",&nbsp;"causes",&nbsp;"certain",&nbsp;"certainly",&nbsp;"changes",&nbsp;"clearly",&nbsp;"co",&nbsp;"com",&nbsp;"come",&nbsp;"comes",&nbsp;"concerning",&nbsp;"consequently",&nbsp;"consider",&nbsp;"considering",&nbsp;"contain",&nbsp;"containing",&nbsp;"</span><span style="color: #0000ff;">contains</span><span style="color: #000000;">",&nbsp;"corresponding",&nbsp;"could",&nbsp;"couldn</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">t",&nbsp;"course",&nbsp;"currently",&nbsp;"d",&nbsp;"definitely",&nbsp;"described",&nbsp;"despite",&nbsp;"did",&nbsp;"didn</span><span style="color: #ff0000;">'</span><span style="color: #000000;">t",&nbsp;"different",&nbsp;"do",&nbsp;"does",&nbsp;"doesn</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">t",&nbsp;"doing",&nbsp;"don</span><span style="color: #ff0000;">'</span><span style="color: #000000;">t",&nbsp;"done",&nbsp;"down",&nbsp;"downwards",&nbsp;"during",&nbsp;"e",&nbsp;"each",&nbsp;"edu",&nbsp;"eg",&nbsp;"eight",&nbsp;"either",&nbsp;"</span><span style="color: #0000ff;">else</span><span style="color: #000000;">",&nbsp;"elsewhere",&nbsp;"enough",&nbsp;"entirely",&nbsp;"especially",&nbsp;"et",&nbsp;"etc",&nbsp;"even",&nbsp;"ever",&nbsp;"every",&nbsp;"everybody",&nbsp;"everyone",&nbsp;"everything",&nbsp;"everywhere",&nbsp;"ex",&nbsp;"exactly",&nbsp;"example",&nbsp;"</span><span style="color: #0000ff;">except</span><span style="color: #000000;">",&nbsp;"f",&nbsp;"far",&nbsp;"few",&nbsp;"fifth",&nbsp;"first",&nbsp;"five",&nbsp;"followed",&nbsp;"following",&nbsp;"follows",&nbsp;"</span><span style="color: #0000ff;">for</span><span style="color: #000000;">",&nbsp;"former",&nbsp;"formerly",&nbsp;"forth",&nbsp;"four",&nbsp;"</span><span style="color: #0000ff;">from</span><span style="color: #000000;">",&nbsp;"further",&nbsp;"furthermore",&nbsp;"g",&nbsp;"get",&nbsp;"gets",&nbsp;"getting",&nbsp;"given",&nbsp;"gives",&nbsp;"</span><span style="color: #0000ff;">go</span><span style="color: #000000;">",&nbsp;"goes",&nbsp;"going",&nbsp;"gone",&nbsp;"got",&nbsp;"gotten",&nbsp;"greetings",&nbsp;"h",&nbsp;"had",&nbsp;"hadn</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">t",&nbsp;"happens",&nbsp;"hardly",&nbsp;"has",&nbsp;"hasn</span><span style="color: #ff0000;">'</span><span style="color: #000000;">t",&nbsp;"have",&nbsp;"haven</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">t",&nbsp;"having",&nbsp;"he",&nbsp;"he</span><span style="color: #ff0000;">'</span><span style="color: #000000;">s",&nbsp;"hello",&nbsp;"help",&nbsp;"hence",&nbsp;"her",&nbsp;"here",&nbsp;"here</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">s",&nbsp;"hereafter",&nbsp;"hereby",&nbsp;"herein",&nbsp;"hereupon",&nbsp;"hers",&nbsp;"herself",&nbsp;"hi",&nbsp;"him",&nbsp;"himself",&nbsp;"his",&nbsp;"hither",&nbsp;"hopefully",&nbsp;"how",&nbsp;"howbeit",&nbsp;"however",&nbsp;"i",&nbsp;"i</span><span style="color: #ff0000;">'</span><span style="color: #000000;">d",&nbsp;"i</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">ll",&nbsp;"i</span><span style="color: #ff0000;">'</span><span style="color: #000000;">m",&nbsp;"i</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">ve",&nbsp;"ie",&nbsp;"if",&nbsp;"ignored",&nbsp;"immediate",&nbsp;"in",&nbsp;"inasmuch",&nbsp;"inc",&nbsp;"indeed",&nbsp;"indicate",&nbsp;"indicated",&nbsp;"indicates",&nbsp;"inner",&nbsp;"insofar",&nbsp;"instead",&nbsp;"into",&nbsp;"inward",&nbsp;"is",&nbsp;"isn</span><span style="color: #ff0000;">'</span><span style="color: #000000;">t",&nbsp;"it",&nbsp;"it</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">d",&nbsp;"it</span><span style="color: #ff0000;">'</span><span style="color: #000000;">ll",&nbsp;"it</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">s",&nbsp;"its",&nbsp;"itself",&nbsp;"j",&nbsp;"just",&nbsp;"k",&nbsp;"keep",&nbsp;"keeps",&nbsp;"kept",&nbsp;"know",&nbsp;"knows",&nbsp;"known",&nbsp;"l",&nbsp;"last",&nbsp;"lately",&nbsp;"later",&nbsp;"latter",&nbsp;"latterly",&nbsp;"least",&nbsp;"less",&nbsp;"lest",&nbsp;"let",&nbsp;"let</span><span style="color: #ff0000;">'</span><span style="color: #000000;">s",&nbsp;"</span><span style="color: #808080;">like</span><span style="color: #000000;">",&nbsp;"liked",&nbsp;"likely",&nbsp;"little",&nbsp;"look",&nbsp;"looking",&nbsp;"looks",&nbsp;"ltd",&nbsp;"m",&nbsp;"mainly",&nbsp;"many",&nbsp;"may",&nbsp;"maybe",&nbsp;"me",&nbsp;"mean",&nbsp;"meanwhile",&nbsp;"merely",&nbsp;"might",&nbsp;"more",&nbsp;"moreover",&nbsp;"most",&nbsp;"mostly",&nbsp;"much",&nbsp;"must",&nbsp;"my",&nbsp;"myself",&nbsp;"n",&nbsp;"name",&nbsp;"namely",&nbsp;"nd",&nbsp;"near",&nbsp;"nearly",&nbsp;"necessary",&nbsp;"need",&nbsp;"needs",&nbsp;"neither",&nbsp;"never",&nbsp;"nevertheless",&nbsp;"new",&nbsp;"</span><span style="color: #0000ff;">next</span><span style="color: #000000;">",&nbsp;"nine",&nbsp;"no",&nbsp;"nobody",&nbsp;"non",&nbsp;"none",&nbsp;"noone",&nbsp;"nor",&nbsp;"normally",&nbsp;"</span><span style="color: #808080;">not</span><span style="color: #000000;">",&nbsp;"nothing",&nbsp;"novel",&nbsp;"now",&nbsp;"nowhere",&nbsp;"o",&nbsp;"obviously",&nbsp;"</span><span style="color: #0000ff;">of</span><span style="color: #000000;">",&nbsp;"</span><span style="color: #0000ff;">off</span><span style="color: #000000;">",&nbsp;"often",&nbsp;"oh",&nbsp;"ok",&nbsp;"okay",&nbsp;"old",&nbsp;"</span><span style="color: #0000ff;">on</span><span style="color: #000000;">",&nbsp;"</span><span style="color: #0000ff;">once</span><span style="color: #000000;">",&nbsp;"one",&nbsp;"ones",&nbsp;"</span><span style="color: #0000ff;">only</span><span style="color: #000000;">",&nbsp;"onto",&nbsp;"</span><span style="color: #808080;">or</span><span style="color: #000000;">",&nbsp;"other",&nbsp;"others",&nbsp;"otherwise",&nbsp;"ought",&nbsp;"our",&nbsp;"ours",&nbsp;"ourselves",&nbsp;"out",&nbsp;"outside",&nbsp;"</span><span style="color: #0000ff;">over</span><span style="color: #000000;">",&nbsp;"overall",&nbsp;"own",&nbsp;"p",&nbsp;"particular",&nbsp;"particularly",&nbsp;"per",&nbsp;"perhaps",&nbsp;"placed",&nbsp;"please",&nbsp;"plus",&nbsp;"possible",&nbsp;"presumably",&nbsp;"probably",&nbsp;"provides",&nbsp;"q",&nbsp;"que",&nbsp;"quite",&nbsp;"qv",&nbsp;"r",&nbsp;"rather",&nbsp;"rd",&nbsp;"re",&nbsp;"really",&nbsp;"reasonably",&nbsp;"regarding",&nbsp;"regardless",&nbsp;"regards",&nbsp;"relatively",&nbsp;"respectively",&nbsp;"</span><span style="color: #ff00ff;">right</span><span style="color: #000000;">",&nbsp;"s",&nbsp;"said",&nbsp;"same",&nbsp;"saw",&nbsp;"say",&nbsp;"saying",&nbsp;"says",&nbsp;"second",&nbsp;"secondly",&nbsp;"see",&nbsp;"seeing",&nbsp;"seem",&nbsp;"seemed",&nbsp;"seeming",&nbsp;"seems",&nbsp;"seen",&nbsp;"self",&nbsp;"selves",&nbsp;"sensible",&nbsp;"sent",&nbsp;"serious",&nbsp;"seriously",&nbsp;"seven",&nbsp;"several",&nbsp;"shall",&nbsp;"she",&nbsp;"should",&nbsp;"shouldn</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">t",&nbsp;"since",&nbsp;"six",&nbsp;"so",&nbsp;"some",&nbsp;"somebody",&nbsp;"somehow",&nbsp;"someone",&nbsp;"something",&nbsp;"sometime",&nbsp;"sometimes",&nbsp;"somewhat",&nbsp;"somewhere",&nbsp;"soon",&nbsp;"sorry",&nbsp;"specified",&nbsp;"specify",&nbsp;"specifying",&nbsp;"still",&nbsp;"sub",&nbsp;"such",&nbsp;"sup",&nbsp;"sure",&nbsp;"t",&nbsp;"t</span><span style="color: #ff0000;">'</span><span style="color: #000000;">s",&nbsp;"take",&nbsp;"taken",&nbsp;"tell",&nbsp;"tends",&nbsp;"th",&nbsp;"than",&nbsp;"thank",&nbsp;"thanks",&nbsp;"thanx",&nbsp;"that",&nbsp;"that</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">s",&nbsp;"thats",&nbsp;"the",&nbsp;"their",&nbsp;"theirs",&nbsp;"them",&nbsp;"themselves",&nbsp;"then",&nbsp;"thence",&nbsp;"there",&nbsp;"there</span><span style="color: #ff0000;">'</span><span style="color: #000000;">s",&nbsp;"thereafter",&nbsp;"thereby",&nbsp;"therefore",&nbsp;"therein",&nbsp;"theres",&nbsp;"thereupon",&nbsp;"these",&nbsp;"they",&nbsp;"they</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">d",&nbsp;"they</span><span style="color: #ff0000;">'</span><span style="color: #000000;">ll",&nbsp;"they</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">re",&nbsp;"they</span><span style="color: #ff0000;">'</span><span style="color: #000000;">ve",&nbsp;"think",&nbsp;"third",&nbsp;"this",&nbsp;"thorough",&nbsp;"thoroughly",&nbsp;"those",&nbsp;"though",&nbsp;"three",&nbsp;"through",&nbsp;"throughout",&nbsp;"thru",&nbsp;"thus",&nbsp;"</span><span style="color: #0000ff;">to</span><span style="color: #000000;">",&nbsp;"together",&nbsp;"too",&nbsp;"took",&nbsp;"toward",&nbsp;"towards",&nbsp;"tried",&nbsp;"tries",&nbsp;"truly",&nbsp;"try",&nbsp;"trying",&nbsp;"twice",&nbsp;"two",&nbsp;"u",&nbsp;"un",&nbsp;"under",&nbsp;"unfortunately",&nbsp;"unless",&nbsp;"unlikely",&nbsp;"until",&nbsp;"unto",&nbsp;"up",&nbsp;"upon",&nbsp;"us",&nbsp;"</span><span style="color: #0000ff;">use</span><span style="color: #000000;">",&nbsp;"used",&nbsp;"useful",&nbsp;"uses",&nbsp;"using",&nbsp;"usually",&nbsp;"v",&nbsp;"value",&nbsp;"various",&nbsp;"very",&nbsp;"via",&nbsp;"viz",&nbsp;"vs",&nbsp;"w",&nbsp;"want",&nbsp;"wants",&nbsp;"was",&nbsp;"wasn</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">t",&nbsp;"way",&nbsp;"we",&nbsp;"we</span><span style="color: #ff0000;">'</span><span style="color: #000000;">d",&nbsp;"we</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">ll",&nbsp;"we</span><span style="color: #ff0000;">'</span><span style="color: #000000;">re",&nbsp;"we</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">ve",&nbsp;"welcome",&nbsp;"well",&nbsp;"went",&nbsp;"were",&nbsp;"weren</span><span style="color: #ff0000;">'</span><span style="color: #000000;">t",&nbsp;"what",&nbsp;"what</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">s",&nbsp;"whatever",&nbsp;"when",&nbsp;"whence",&nbsp;"whenever",&nbsp;"where",&nbsp;"where</span><span style="color: #ff0000;">'</span><span style="color: #000000;">s",&nbsp;"whereafter",&nbsp;"whereas",&nbsp;"whereby",&nbsp;"wherein",&nbsp;"whereupon",&nbsp;"wherever",&nbsp;"whether",&nbsp;"which",&nbsp;"</span><span style="color: #0000ff;">while</span><span style="color: #000000;">",&nbsp;"whither",&nbsp;"who",&nbsp;"who</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">s",&nbsp;"whoever",&nbsp;"whole",&nbsp;"whom",&nbsp;"whose",&nbsp;"why",&nbsp;"will",&nbsp;"willing",&nbsp;"wish",&nbsp;"with",&nbsp;"within",&nbsp;"without",&nbsp;"won</span><span style="color: #ff0000;">'</span><span style="color: #000000;">t",&nbsp;"wonder",&nbsp;"would",&nbsp;"would",&nbsp;"wouldn</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">t",&nbsp;"x",&nbsp;"y",&nbsp;"yes",&nbsp;"yet",&nbsp;"you",&nbsp;"you</span><span style="color: #ff0000;">'</span><span style="color: #000000;">d",&nbsp;"you</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">ll",&nbsp;"you</span><span style="color: #ff0000;">'</span><span style="color: #000000;">re",&nbsp;"you</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">ve",&nbsp;"your",&nbsp;"yours",&nbsp;"yourself",&nbsp;"yourselves",&nbsp;"z",&nbsp;"zero",<br>让我们看一下其中的一些词.如果你懒的输入,但是想查找&#8221;love&#8221;这个词,象下面这样:<br>mysql&gt;&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;fulltext_sample&nbsp;WHERE&nbsp;MATCH(copy)&nbsp;AGAINST(</span><span style="color: #ff0000;">'</span><span style="color: #000000;">lov</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">);<br>Empty&nbsp;set&nbsp;(0.00&nbsp;sec)<br>什么都没返回,因为全文索引只包含完整的单词,不是部分单词.如果想得到返回,你必须把单词写完整,就像第一个例子里一样.<br>就像我们提过的,连字符单词在全文索引中被排除(它们被作为单独的单词索引),因此下面的语句什么都不返回:<br>mysql&gt;&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;fulltext_sample&nbsp;WHERE&nbsp;MATCH(copy)&nbsp;AGAINST(</span><span style="color: #ff0000;">'</span><span style="color: #808080;">all-</span><span style="color: #000000;">out</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">);<br>Empty&nbsp;set&nbsp;(0.00&nbsp;sec)<br>很不幸,两个单词都小于4个字符,因此单独搜索时也不会出现,而且通常的搜索中也不会出现.本文的第二部分中使用BOOLEAN&nbsp;MODE搜索可以搜索部分的或者包含连字符的单词.<br>你也可以一次搜索多个单词,用逗号分隔.下面的例子查找包含&#8221;here&#8221;和&#8221;appears&#8221;的记录:<br>mysql&gt;&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;fulltext_sample&nbsp;WHERE&nbsp;MATCH(copy)&nbsp;AGAINST(</span><span style="color: #ff0000;">'</span><span style="color: #000000;">here</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">,</span><span style="color: #ff0000;">'</span><span style="color: #000000;">appears</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">);<br>Empty&nbsp;set&nbsp;(0.01&nbsp;sec)<br>出乎意料这个语句没有返回.但是仔细看看忽略列表,这个词被列在其中,因此被从索引中排除了.忽略列表可能是人们解释MySQL全文索引没有生效的通常原因.如果你的查询返回了一个结果,那么你的版本的MySQL的忽略列表不包含&#8221;here&#8221;这个词.<br>关联度<br>下面的例子说明记录返回的优先级<br>mysql&gt;&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;fulltext_sample&nbsp;WHERE&nbsp;MATCH(copy)&nbsp;AGAINST(</span><span style="color: #ff0000;">'</span><span style="color: #000000;">good,alert</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">);<br>+---------------------------+<br>|&nbsp;copy&nbsp;|<br>+---------------------------+<br>|&nbsp;A&nbsp;good&nbsp;alert&nbsp;|<br>|&nbsp;It&nbsp;appears&nbsp;good&nbsp;from&nbsp;here&nbsp;|<br>|&nbsp;An&nbsp;all-out&nbsp;alert&nbsp;|<br>+---------------------------+<br>记录&#8221;A&nbsp;good&nbsp;alert&#8221;首先出现,因为它同时包含要搜索的两个词.你不必相信我-只需要看看MySQL在结果中显示的优先级.简单的在字段列表中重复MATCH()函数,例如:<br>mysql&gt;&nbsp;SELECT&nbsp;copy,MATCH(copy)&nbsp;AGAINST(</span><span style="color: #ff0000;">'</span><span style="color: #000000;">good,alert</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">)&nbsp;AS&nbsp;relevance<br>FROM&nbsp;fulltext_sample&nbsp;WHERE&nbsp;MATCH(copy)&nbsp;AGAINST(</span><span style="color: #ff0000;">'</span><span style="color: #000000;">good,alert</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">);<br>+---------------------------+------------------+<br>|&nbsp;copy&nbsp;|&nbsp;relevance&nbsp;|<br>+---------------------------+------------------+<br>|&nbsp;A&nbsp;good&nbsp;alert&nbsp;|&nbsp;1.3551264824316&nbsp;|<br>|&nbsp;An&nbsp;all-out&nbsp;alert&nbsp;|&nbsp;0.68526663197496&nbsp;|<br>|&nbsp;It&nbsp;appears&nbsp;good&nbsp;from&nbsp;hear&nbsp;|&nbsp;0.67003110026735&nbsp;|<br>+---------------------------+------------------+<br>关联度的计算非常复杂,它基于索引中单词的数量,记录中不同单词的个数,索引和返回结果中单词的总数,以及单词的重要程度.这个数字可能在你的MySQL版本中有所不同,MySQL偶尔会强化计算逻辑.<br>对大多数应用来说标准的全文索引搜索非常有用而充分,MySQL&nbsp;4让它更加强大.</span></div>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-09-22 09:37 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/09/22/5812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 优化MySQL数据库性能的八种方法</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/09/08/5734.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Mon, 08 Sep 2008 10:36:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/09/08/5734.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5734.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/09/08/5734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5734.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5734.html</trackback:ping><description><![CDATA[<strong>&nbsp;&nbsp;&nbsp;&nbsp; 1、选取最适用的字段属性</strong>
<p>　　MySQL可以很好的支持大数据量的存取，<span style="color: red;">但是一般说来，数据库中的表越小，在它上面执行的查询也就会越快</span>。因此，在创建表的时候，为了获得更
好的性能，我们可以将表中<span style="color: red;">字段的宽度设得尽可能小</span>。例如，在定义邮政编码这个字段时，如果将其设置为CHAR(255),显然给数据库增加了不必要的空
间，甚至使用VARCHAR这种类型也是多余的，因为CHAR(6)就可以很好的完成任务了。同样的，如果可以的话，我们应该使用MEDIUMINT而不
是BIGIN来定义整型字段。</p>
<p>　　另外一个提高效率的方法是在可能的情况下，应该尽量<span style="color: red;">把字段设置为NOT NULL</span>，这样在将来执行查询的时候，数据库不用去比较NULL值。</p>
<p>　　对于某些文本字段，例如&#8220;<span style="color: red;">省份&#8221;或者&#8220;性别&#8221;，我们可以将它们定义为ENUM类型</span>。因为在MySQL中，<span style="color: red;">ENUM类型被当作数值型数据来处理</span>，而数值型数据被处理起来的速度要比文本类型快得多。这样，我们又可以提高数据库的性能。</p>
<p>　　<strong> 2、使用连接（JOIN）来代替子查询(Sub-Queries)</strong> </p>
<p>　　MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果，然后把这个结果作为过滤条件用在另一
个查询中。例如，我们要将客户基本信息表中没有任何订单的客户删除掉，就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来，然后将结果传递
给主查询，如下所示：</p>
<p>　　DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )</p>
<p>　　使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作，同时也可以避免事务或者表锁死，并且写起来也很容易。但是，有些情况
下，子查询可以被更有效率的连接（JOIN）.. 替代。例如，假设我们要将所有没有订单记录的用户取出来，可以用下面这个查询完成：</p>
<p>　　SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )</p>
<p>　　如果使用连接（JOIN）.. 来完成这个查询工作，速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话，性能将会更好，查询如下：</p>
<p>　　SELECT * FROM customerinfo LEFT JOIN salesinfoON
customerinfo.CustomerID=salesinfo. CustomerID WHERE
salesinfo.CustomerID IS NULL</p>
<p>　　<span style="color: red;">连接（JOIN）.. 之所以更有效率一些，是因为 MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。</span></p>
<p>　　<strong> 3、使用联合(UNION)来代替手动创建的临时表</strong> </p>
<p>　　MySQL 从 4.0 的版本开始支持<span style="color: red;"> UNION 查询，它可以把需要使用临时表的两条或更多的 SELECT
查询合并的一个查询中。在客户端的查询会话结束的时候，临时表会被自动删除</span>，从而保证数据库整齐、高效。使用 UNION
来创建查询的时候，我们只需要用 UNION作为关键字把多个 SELECT 语句连接起来就可以了，要注意的是所有 SELECT
语句中的字段数目要想同。下面的例子就演示了一个使用 UNION的查询。</p>
<p>　　SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM author<br>　　UNION<br>　　SELECT Name, Supplier FROM product</p>
<p>　　<strong> 4、事务</strong> </p>
<p>　　尽管我们可以使用子查询（Sub-Queries）、连接（JOIN）和联合（UNION）来创建各种各样的查询，但不是所有的数据库操作都可
以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。但是在这种情况下，当这个语句块中的某一条语句运行出错
的时候，整个语句块的操作就会变得不确定起来。设想一下，要把某个数据同时插入两个相关联的表中，可能会出现这样的情况：第一个表中成功更新后，数据库突
然出现意外状况，造成第二个表中的操作没有完成，这样，就会造成数据的不完整，甚至会破坏数据库中的数据。要避免这种情况，就应该使用事务，它的作用是：
要么语句块中每条语句都操作成功，要么都失败。换句话说，就是可以保持数据库中数据的一致性和完整性。事物以BEGIN
关键字开始，COMMIT关键字结束。在这之间的一条SQL操作失败，那么，ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。</p>
<p style="color: red;">　　BEGIN;</p>
<p style="color: red;">　　INSERT INTO salesinfo SET CustomerID=14;</p>
<p style="color: red;">　　UPDATE inventory SET Quantity=11</p>
<p style="color: red;">　　WHERE item='book';</p>
<p style="color: red;">　　COMMIT;</p>
<p>　　<span style="color: red;">事务的另一个重要作用是当多个用户同时使用相同的数据源时，它可以利用<span style="color: #0817ff;">锁定数据库</span>的方法来为用户提供一种安全的访问方式，这样可以保证用户的操作不被其它的用户所干扰。</span></p>
<p><strong> 5、锁定表</strong>
</p>
<p>　　尽管事务是维护数据库完整性的一个非常好的方法，但却因为它的独占性，有时会影响数据库的性能，尤其是在很大的应用系统中。由于在事务执行的过程中，数据库将会被锁定，因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户</p>
<p>　　来使用，事务造成的影响不会成为一个太大的问题；但假设有成千上万的用户同时访问一个数据库系统，例如访问一个电子商务网站，就会产生比较严重的响应延迟。</p>
<p>　　其实，有些情况下我们可以通过<span style="color: #0817ff;">锁定表</span>的方法来获得更好的性能。下面的例子就用锁定表的方法来完成前面一个例子中事务的功能。</p>
<p>　　<span style="color: #0817ff;">LOCK TABLE inventory WRITE</span><br>　　SELECT Quantity FROM inventory<br>　　WHERE Item='book';<br>　　...</p>
<p>　　UPDATE inventory SET Quantity=11<br>　　WHERE Item='book';<br>　　<span style="color: #0817ff;">UNLOCK TABLES</span></p>
<p>　　这里，我们用一个 SELECT 语句取出初始数据，通过一些计算，用 UPDATE 语句将新值更新到表中。包含有 WRITE 关键字的
LOCK TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前，不会有其它的访问来对 inventory
进行插入、更新或者删除的操作。</p>
<p>　　<strong> 6、使用外键</strong> </p>
<p>　　<span style="color: #0817ff;">锁定表的方法可以维护数据的完整性，但是它却不能保证数据的关联性</span>。<span style="color: #0817ff;">这个时候我们就可以使用外键</span>。例如，外键可以保证每一条销售记录都指向某一
个存在的客户。在这里，外键可以把customerinfo
表中的CustomerID映射到salesinfo表中CustomerID，任何一条没有合法CustomerID的记录都不会被更新或插入到
salesinfo中。</p>
<p>　　CREATE TABLE customerinfo<br>　　(<br>　　　CustomerID INT NOT NULL ,<br>　　　PRIMARY KEY ( CustomerID )<br>　　) TYPE = INNODB;<br>　　CREATE TABLE salesinfo<br>　　(<br>　　　SalesID INT NOT NULL,<br>　　　CustomerID INT NOT NULL,<br>　　　PRIMARY KEY(CustomerID, SalesID),<br>　　　FOREIGN KEY (CustomerID) REFERENCES customerinfo<br>　　　(CustomerID) ON DELETECASCADE<br>　　) TYPE = INNODB;</p>
<p>　　注意例子中的参数&#8220;<span style="color: #ff0000;">ON DELETE CASCADE&#8221;。该参数保证当 customerinfo
表中的一条客户记录被删除的时候，salesinfo 表中所有与该客户相关的记录也会被自动删除</span>。<span style="color: #ff0000;">如果要在 MySQL
中使用外键，一定要记住在创建表的时候将表的类型定义为事务安全表 InnoDB类型</span>。该类型不是 MySQL 表的默认类型。定义的方法是在
CREATE TABLE 语句中加上 TYPE=INNODB。如例中所示。</p>
<p>　　<strong> 7、使用索引</strong> </p>
<p>　　索引是提高数据库性能的常用方法，它可以令数据库服务器以比没有索引快得多的速度检索特定的行，<span style="color: #ff0000;">尤其是在查询语句当中包含有MAX(),
MIN()和ORDERBY这些命令的时候，性能提高更为明显</span>。那该对哪些字段建立索引呢？一般说来，索引应建立在那些将用于JOIN,
WHERE判断和ORDER
BY排序的字段上。<span style="color: #ff0000;">尽量不要对数据库中某个含有大量重复的值的字段建立索引</span>。<span style="color: #ff0000;">对于一个ENUM类型的字段来说，出现大量重复值是很有可能的情况</span>，例如
customerinfo中的&#8220;province&#8221;..
字段，在这样的字段上建立索引将不会有什么帮助；相反，还有可能降低数据库的性能。我们在创建表的时候可以同时创建合适的索引，也可以使用ALTER
TABLE或CREATE INDEX在以后创建索引。此外，MySQL</p>
<p>　　从版本3.23.23开始支持全文索引和搜索。<span style="color: #ff0000;">全文索引在MySQL 中是一个FULLTEXT类型索引</span>，<span style="color: #ff0000;">但仅能用于MyISAM
类型的表</span>。对于一个大的数据库，将数据装载到一个没有FULLTEXT索引的表中，然后再使用ALTER TABLE或CREATE
INDEX创建索引，将是非常快的。<span style="color: #ff0000;">但如果将数据装载到一个已经有FULLTEXT索引的表中，执行过程将会非常慢</span>。</p>
<p>　　<strong> 8、优化的查询语句</strong> </p>
<p>　　绝大多数情况下，使用索引可以提高查询的速度，但如果SQL语句使用不恰当的话，索引将无法发挥它应有的作用。下面是应该注意的几个方面。首
先，<span style="color: #ff0000;">最好是在相同类型的字段间进行比较的操作。</span>在MySQL
3.23版之前，这甚至是一个必须的条件。例如不能将一个建有索引的INT字段和BIGINT字段进行比较；但是作为特殊的情况，在CHAR类型的字段和
VARCHAR类型字段的字段大小相同的时候，可以将它们进行比较。<span style="color: #ff0000;">其次，在建有索引的字段上尽量不要使用函数进行操作。</span></p>
<p>　　例如，在一个DATE类型的字段上使用YEAE()函数时，将会使索引不能发挥应有的作用。所以，下面的两个查询虽然返回的结果一样，但后者要比前者快得多。</p>
<p>　　SELECT * FROM order WHERE YEAR(OrderDate)&lt;2001;<br>　　SELECT * FROM order WHERE OrderDate&lt;"2001-01-01";</p>
<p>　　同样的情形也会发生在对数值型字段进行计算的时候：</p>
<p>　　SELECT * FROM inventory <span style="color: #ff0000;">WHERE Amount/7&lt;24;</span><br>　　SELECT * FROM inventory <span style="color: #ff0000;">WHERE Amount&lt;24*7;</span></p>
<p>　　上面的两个查询也是返回相同的结果，但后面的查询将比前面的一个快很多。第三，在搜索字符型字段时，我们有时会使用 LIKE 关键字和通配符，这种做法虽然简单，但却也是以牺牲系统性能为代价的。例如下面的查询将会比较表中的每一条记录。</p>
<p>　　SELECT * FROM books<br>　　WHERE name like "MySQL%"</p>
<p>　　但是如果换用下面的查询，返回的结果一样，但速度就要快上很多：</p>
<p>　　SELECT * FROM books<br>　　WHERE name&gt;="MySQL"and name&lt;"MySQM"</p>
<p>　　最后，<span style="color: #ff0000;">应该注意避免在查询中让MySQL进行自动类型转换，因为转换过程也会使索引变得不起作用。</span></p>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-09-08 18:36 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/09/08/5734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高Oracle性能的方法(转)</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/09/08/5731.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Mon, 08 Sep 2008 05:34:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/09/08/5731.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5731.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/09/08/5731.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5731.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5731.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">一、问题的提出<br>　　在应用系统开发初期，由于开发数据库数据比较少，对于查询SQL语句，复杂视图的的编写等体会不出SQL语句各种写法的性能优劣，但是如果将应用系统提交实际应用后，随着数据库中数据的增加，系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据，劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍，可见对于一个系统不是简单地能实现其功能就可，而是要写出高质量的SQL语句，提高系统的可用性。<br><br>在多数情况下，Oracle使用索引来更快地遍历表，优化器主要根据定义的索引来提高性能。但是，如果在&nbsp;SQL语句的where子句中写的SQL代码不合理，就会造成优化器删去索引而使用全表扫描，一般就这种SQL语句就是所谓的劣质SQL语句。在编写&nbsp;SQL语句时我们应清楚优化器根据何种原则来删除索引，这有助于写出高性能的SQL语句。<br><br>二、SQL语句编写注意问题<br>下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中，即使某些列存在索引，但是由于编写了劣质的SQL，系统在运行该SQL语句时也不能使用该索引，而同样使用全表扫描，这就造成了响应速度的极大降低。<br><br></span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;IS&nbsp;NULL&nbsp;与&nbsp;IS&nbsp;NOT&nbsp;NULL<br>不能用null作索引，任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下，只要这些列中有一列含有null，该列就会从索引中排除。也就是说如果某列存在空值，即使对该列建索引也不会提高性能。<br><br>任何在where子句中使用is&nbsp;null或is&nbsp;not&nbsp;null的语句优化器是不允许使用索引的。<br><br></span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;联接列<br><br>对于有联接的列，即使最后的联接值为一个静态值，优化器是不会使用索引的。我们一起来看一个例子，假定有一个职工表(employee），对于一个职工的姓和名分成两列存放（FIRST_NAME和LAST_NAME），现在要查询一个叫比尔.克林顿（Bill&nbsp;Cliton）的职工。<br><br>下面是一个采用联接查询的SQL语句，<br><br>select&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;from&nbsp;employss<br>where<br>first_name</span><span style="color: #000000;">||</span><span style="color: #000000;">''</span><span style="color: #000000;">||</span><span style="color: #000000;">last_name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">'Beill&nbsp;Cliton'<br><br>上面这条语句完全可以查询出是否有Bill&nbsp;Cliton这个员工，但是这里需要注意，系统优化器对基于last_name创建的索引没有使用。<br><br>当采用下面这种SQL语句的编写，Oracle系统就可以采用基于last_name创建的索引。<br><br>Select&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;from&nbsp;employee&nbsp;where&nbsp;first_name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">'Beill'&nbsp;and&nbsp;last_name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">'Cliton'<br><br>遇到下面这种情况又如何处理呢？如果一个变量（name）中存放着Bill&nbsp;Cliton这个员工的姓名，对于这种情况我们又如何避免全程遍历，使用索引呢？可以使用一个函数，将变量name中的姓和名分开就可以了，但是有一点需要注意，这个函数是不能作用在索引列上。下面是SQL查询脚本：<br><br>select&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;from&nbsp;employee&nbsp;where&nbsp;first_name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SUBSTR('</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">name',</span><span style="color: #000000;">1</span><span style="color: #000000;">,INSTR('</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">name','&nbsp;')</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;and&nbsp;last_name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SUBSTR('</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">name',INSTR('</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">name&#8217;,'&nbsp;')</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br><br></span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;带通配符（</span><span style="color: #000000;">%</span><span style="color: #000000;">）的like语句<br><br>同样以上面的例子来看这种情况。目前的需求是这样的，要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句：<br><br>select&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;from&nbsp;employee&nbsp;where&nbsp;last_name&nbsp;like&nbsp;'</span><span style="color: #000000;">%</span><span style="color: #000000;">cliton</span><span style="color: #000000;">%</span><span style="color: #000000;">'<br><br>这里由于通配符（</span><span style="color: #000000;">%</span><span style="color: #000000;">）在搜寻词首出现，所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况，但是一定要心中有底，通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时，优化器就能利用索引。在下面的查询中索引得到了使用：<br><br>select&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;from&nbsp;employee&nbsp;where&nbsp;last_name&nbsp;like&nbsp;'c</span><span style="color: #000000;">%</span><span style="color: #000000;">'<br><br></span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;Order&nbsp;by语句<br><br>ORDER&nbsp;BY语句决定了Oracle如何将返回的查询结果排序。Order&nbsp;by语句对要排序的列没有什么特别的限制，也可以将函数加入列中（象联接或者附加等）。任何在Order&nbsp;by语句的非索引项或者有计算表达式都将降低查询速度。<br><br>仔细检查order&nbsp;by语句以找出非索引项或者表达式，它们会降低性能。解决这个问题的办法就是重写order&nbsp;by语句以使用索引，也可以为所使用的列建立另外一个索引，同时应绝对避免在order&nbsp;by子句中使用表达式。<br><br></span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;NOT<br><br>我们在查询时经常在where子句使用一些逻辑表达式，如大于、小于、等于以及不等于等等，也可以使用and（与）、or（或）以及not（非）。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子：<br><br><img src="http://www.phpweblog.net/Images/dot.gif">&nbsp;where&nbsp;not&nbsp;(status&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">'VALID')<br><br>如果要使用NOT，则应在取反的短语前面加上括号，并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中，这就是不等于（</span><span style="color: #000000;">&lt;&gt;</span><span style="color: #000000;">）运算符。换句话说，即使不在查询where子句中显式地加入NOT词，NOT仍在运算符中，见下例：<br><br><img src="http://www.phpweblog.net/Images/dot.gif">&nbsp;where&nbsp;status&nbsp;</span><span style="color: #000000;">&lt;&gt;</span><span style="color: #000000;">'INVALID'<br><br>再看下面这个例子：<br><br>select&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;from&nbsp;employee&nbsp;where&nbsp;salary</span><span style="color: #000000;">&lt;&gt;</span><span style="color: #000000;">3000</span><span style="color: #000000;">;<br><br>对这个查询，可以改写为不使用NOT：<br><br>select&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;from&nbsp;employee&nbsp;where&nbsp;salary</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">3000</span><span style="color: #000000;">&nbsp;or&nbsp;salary</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">3000</span><span style="color: #000000;">;<br><br>虽然这两种查询的结果一样，但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引，而第一种查询则不能使用索引。<br><br></span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;IN和EXISTS<br><br>有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询。在where子句中可以使用两种格式的子查询。<br><br>第一种格式是使用IN操作符：<br><br><img src="http://www.phpweblog.net/Images/dot.gif">&nbsp;where&nbsp;column&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">(select&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;from&nbsp;<img src="http://www.phpweblog.net/Images/dot.gif">&nbsp;where&nbsp;<img src="http://www.phpweblog.net/Images/dot.gif">);<br><br>第二种格式是使用EXIST操作符：<br><br><img src="http://www.phpweblog.net/Images/dot.gif">&nbsp;where&nbsp;exists&nbsp;(select&nbsp;'X'&nbsp;from&nbsp;<img src="http://www.phpweblog.net/Images/dot.gif">where&nbsp;<img src="http://www.phpweblog.net/Images/dot.gif">);<br><br>我相信绝大多数人会使用第一种格式，因为它比较容易编写，而实际上第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。<br><br>第二种格式中，子查询以&#8216;select&nbsp;'X'开始。运用EXISTS子句不管子查询从表中抽取什么数据它只查看where子句。这样优化器就不必遍历整个表而仅根据索引就可完成工作（这里假定在where语句中使用的列存在索引）。相对于IN子句来说，EXISTS使用相连子查询，构造起来要比IN子查询困难一些。<br><br>通过使用EXIST，Oracle系统会首先检查主查询，然后运行子查询直到它找到第一个匹配项，这就节省了时间。Oracle系统在执行IN子查询时，首先执行子查询，并将获得的结果列表存放在在一个加了索引的临时表中。在执行子查询之前，系统先将主查询挂起，待子查询执行完毕，存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。<br><br>同时应尽可能使用NOT&nbsp;EXISTS来代替NOT&nbsp;IN，尽管二者都使用了NOT（不能使用索引而降低速度），NOT&nbsp;EXISTS要比NOT&nbsp;IN查询效率更高。</span></div>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-09-08 13:34 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/09/08/5731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL_语句详细说明（部分）</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/09/02/5701.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Tue, 02 Sep 2008 10:14:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/09/02/5701.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5701.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/09/02/5701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5701.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5701.html</trackback:ping><description><![CDATA[<div id="postmessage_512376" class="t_msgfont"><strong> <font style="font-size: 9pt;">SQL</font></strong> <strong> <font face="宋体 "><font style="font-size: 9pt;">语句教程</font></font></strong> <strong> <font style="font-size: 9pt;">(11) Group By</font></strong> <strong> <font style="font-size: 9pt;"> </font></strong> <br>
<p align="left"><font face="宋体 "><font style="font-size: 9pt;">我们现在回到函数上。记得我们用</font></font><br>
<font style="font-size: 9pt;">SUM</font><br>
<font face="宋体 "><font style="font-size: 9pt;">这个指令来算出所有的</font></font><font style="font-size: 9pt;"> Sales (</font><font face="宋体 "><font style="font-size: 9pt;">营业额</font></font><font style="font-size: 9pt;">)</font><font face="宋体 "><font style="font-size: 9pt;">吧！如果我们的需求变成是要算出每一间店</font></font><font style="font-size: 9pt;"> (store_name) </font><font face="宋体 "><font style="font-size: 9pt;">的营业额</font></font><font style="font-size: 9pt;"> (sales)</font><font face="宋体 "><font style="font-size: 9pt;">，那怎么办呢？在这个情况下，我们要做到两件事：第一，我们对于</font></font><font style="font-size: 9pt;"> store_name </font><font face="宋体 "><font style="font-size: 9pt;">及</font></font><font style="font-size: 9pt;"> Sales </font><font face="宋体 "><font style="font-size: 9pt;">这两个栏位都要选出。第二，我们需要确认所有的</font></font><font style="font-size: 9pt;"> sales </font><font face="宋体 "><font style="font-size: 9pt;">都要依照各个</font></font><font style="font-size: 9pt;"> store_name </font><font face="宋体 "><font style="font-size: 9pt;">来分开算。这个语法为：</font></font><br>
<font style="font-size: 9pt;">SELECT "</font><font face="宋体 "><font style="font-size: 9pt;">栏位</font></font><font style="font-size: 9pt;">1", SUM("</font><font face="宋体 "><font style="font-size: 9pt;">栏位</font></font><font style="font-size: 9pt;">2") FROM "</font><font face="宋体 "><font style="font-size: 9pt;">表格名</font></font><font style="font-size: 9pt;">" GROUP BY "</font><font face="宋体 "><font style="font-size: 9pt;">栏位</font></font><font style="font-size: 9pt;">1"</font><br>
<font face="宋体 "><font style="font-size: 9pt;">在我们的示范上</font></font><font style="font-size: 9pt;"><br>
Store_Information </font><font face="宋体 "><font style="font-size: 9pt;">表格</font></font></p>
<table class="t_table" style="width: 269px;" bgcolor="#999999" cellspacing="0">
    <tbody>
        <tr>
            <td width="93">
            <p align="center"><font style="font-size: 9pt;">store_name</font></p>
            </td>
            <td width="63">
            <p align="center"><font style="font-size: 9pt;">sales</font></p>
            </td>
            <td width="103">
            <p align="center"><font style="font-size: 9pt;">date</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font style="font-size: 9pt;">Los Angeles</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">$1500</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">jan-05-1999</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font style="font-size: 9pt;">San Francisco</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">$300</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">jan-08-1999</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font style="font-size: 9pt;">Boston</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">$700</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">jan-08-1999</font></p>
            </td>
        </tr>
    </tbody>
</table>
<br>
<font face="宋体 "><font style="font-size: 9pt;">我们就打入</font></font><br>
<font style="font-size: 9pt;">SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name</font><br>
<strong> <font face="宋体 "><font style="font-size: 9pt;">结果</font></font></strong> <strong> <font style="font-size: 9pt;">:</font></strong> <font style="font-size: 9pt;"><br>
<u>store_name</u> <u>SUM(Sales)</u> <br>
Los Angeles $1800 <br>
San Diego $250 <br>
Boston $700 <br>
<br>
</font><font style="color: red;" face="宋体 "><font style="font-size: 9pt;">当我们选不只一个栏位，且其中至少一个栏位有包含函数的运用时，我们就需要用到</font></font><font style="font-size: 9pt; color: red;"> GROUP BY </font><font style="color: red;" face="宋体 "><font style="font-size: 9pt;">这个指令。在这个情况下，我们需要确定我们有</font></font><font style="font-size: 9pt; color: red;"> GROUP BY </font><font style="color: red;" face="宋体 "><font style="font-size: 9pt;">所有其他的栏位。换句话说，除了有包括函数的栏位外，我们都需要将其放在</font></font><font style="font-size: 9pt; color: red;"> GROUP BY </font><font style="color: red;" face="宋体 "><font style="font-size: 9pt;">的子句中。</font></font><br>
<strong> <font style="font-size: 9pt;"> </font></strong> <br>
<strong> <font style="font-size: 9pt;">SQL</font></strong> <strong> <font face="宋体 "><font style="font-size: 9pt;">语句教程</font></font></strong> <strong> <font style="font-size: 9pt;">(12) HAVING</font></strong> <strong> <font style="font-size: 9pt;"> </font></strong> <br>
<p align="left"><font face="宋体 "><font style="font-size: 9pt;">那我们<span style="color: red;">如何对函数产生的值来设定条件呢？</span>举例来说，我们可能只需要知道哪些店的营业额有超过</font></font><font style="font-size: 9pt;"> $1,500</font><font face="宋体 "><font style="font-size: 9pt;">。在这个情况下，我们不能使用</font></font><br>
<font style="font-size: 9pt;">WHERE</font><br>
<font face="宋体 "><font style="font-size: 9pt;">的指令。那要怎么办呢？很幸运地，</font></font><font style="font-size: 9pt;">SQL </font><font face="宋体 "><font style="font-size: 9pt;">有提供一个</font></font><br>
<font style="font-size: 9pt;">HAVING</font><br>
<font face="宋体 "><font style="font-size: 9pt;">的指令，而我们就可以用这个指令来达到这个目标。</font></font><br>
<font style="font-size: 9pt;">HAVING</font><br>
<font face="宋体 "><font style="font-size: 9pt;">子句通常是在一个</font></font><font style="font-size: 9pt;"> SQL </font><font face="宋体 "><font style="font-size: 9pt;">句子的最后。一个含有</font></font><font style="font-size: 9pt;"> HAVING </font><font face="宋体 "><font style="font-size: 9pt;">子句的</font></font><font style="font-size: 9pt;"> SQL </font><font face="宋体 "><font style="font-size: 9pt;">并不一定要包含</font></font><br>
<font style="font-size: 9pt;">GROUP BY</font><br>
<font face="宋体 "><font style="font-size: 9pt;">子句。</font></font><font style="font-size: 9pt;">HAVING</font><br>
<font face="宋体 "><font style="font-size: 9pt;">的语法如下：</font></font><br>
<font style="font-size: 9pt;">SELECT "</font><font face="宋体 "><font style="font-size: 9pt;">栏位</font></font><font style="font-size: 9pt;">1", SUM("</font><font face="宋体 "><font style="font-size: 9pt;">栏位</font></font><font style="font-size: 9pt;">2") FROM "</font><font face="宋体 "><font style="font-size: 9pt;">表格名</font></font><font style="font-size: 9pt;">" GROUP BY "</font><font face="宋体 "><font style="font-size: 9pt;">栏位</font></font><font style="font-size: 9pt;">1" HAVING (</font><font face="宋体 "><font style="font-size: 9pt;">函数条件</font></font><font style="font-size: 9pt;">)</font><br>
<font face="宋体 "><font style="font-size: 9pt;">请读者注意：</font></font><font style="font-size: 9pt;"> <span style="color: red;">GROUP BY </span></font><font face="宋体 "><font style="font-size: 9pt;"><span style="color: red;">子句并不是一定需要的</span>。</font></font><br>
<font face="宋体 "><font style="font-size: 9pt;">在我们</font></font><font style="font-size: 9pt;">Store_Information </font><font face="宋体 "><font style="font-size: 9pt;">表格这个例子中</font></font><font style="font-size: 9pt;"><br>
Store_Information </font><font face="宋体 "><font style="font-size: 9pt;">表格</font></font></p>
<table class="t_table" style="width: 269px;" bgcolor="#999999" cellspacing="0">
    <tbody>
        <tr>
            <td width="93">
            <p align="center"><font style="font-size: 9pt;">store_name</font></p>
            </td>
            <td width="63">
            <p align="center"><font style="font-size: 9pt;">sales</font></p>
            </td>
            <td width="103">
            <p align="center"><font style="font-size: 9pt;">date</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font style="font-size: 9pt;">Los Angeles</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">$1500</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">jan-05-1999</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font style="font-size: 9pt;">San Francisco</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">$300</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">jan-08-1999</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="left"><font style="font-size: 9pt;">Boston</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">$700</font></p>
            </td>
            <td>
            <p align="center"><font style="font-size: 9pt;">jan-08-1999</font></p>
            </td>
        </tr>
    </tbody>
</table>
<br>
<font face="宋体 "><font style="font-size: 9pt;">我们打入</font></font><br>
<font style="font-size: 9pt;">SELECT store_name, SUM(sales) FROM Store_Information GROUP BY store_name HAVING SUM(sales) &gt; 1500</font><br>
<strong> <font face="宋体 "><font style="font-size: 9pt;">结果</font></font></strong> <strong> <font style="font-size: 9pt;">:</font></strong> <font style="font-size: 9pt;"><br>
<br>
<u>store_name</u> <u>SUM(Sales)</u> <br>
Los Angeles $1800</font></div>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-09-02 18:14 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/09/02/5701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何用数据库保存多级结构的数据</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/09/02/5695.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Tue, 02 Sep 2008 05:38:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/09/02/5695.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5695.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/09/02/5695.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5695.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5695.html</trackback:ping><description><![CDATA[<p>产品分类，多级的树状结构的论坛，邮件列表等许多地方我们都会遇到这样的问题：如何存储多级结构的数据？在<a href="http://hi.baidu.com/yufengshop/blog/item/%20:;" target="_self"><u><strong> <font color="#800080">PHP</font></strong> </u></a>的应用中，提供后台数据存储的通常是关系型<a href="http://hi.baidu.com/yufengshop/blog/item/%20:;" target="_self"><u><strong> <font color="#800080">数据库</font></strong> </u></a>，它能够保存大量的数据，提供高效的数据检索和更新服务。然而关系型数据的基本形式是纵横交错的表，是一个平面的结构，如果要将多级树状结构存储在关系型数据库里就需要进行合理的翻译<a href="http://hi.baidu.com/yufengshop/blog/item/%20:;" target="_self"><u><strong> <font color="#800080">工作</font></strong> </u></a>。接下来我会将自己的所见所闻和一些实用的经验和大家探讨一下：&nbsp;&nbsp;<br>
<br>
层级结构的数据保存在平面的数据库中基本上有两种常用设计<a href="http://hi.baidu.com/yufengshop/blog/item/%20:;" target="_self"><u><strong> <font color="#800080">方法</font></strong> </u></a>：&nbsp;&nbsp;<br>
<br>
1、毗邻目录模式(adjacency list model)&nbsp;&nbsp;<br>
<br>
2、预排序遍历树算法(modified preorder tree traversal algorithm)&nbsp;&nbsp;<br>
<br>
我不是计算机专业的，也没有学过什么数据结构的东西，所以这两个名字都是我自己按照字面的意思翻的，如果说错了还请多多指教。&nbsp;&nbsp;<br>
这两个东西听着好像很吓人，其实非常容易理解。这里我用一个简单食品目录作为我们的示例数据。&nbsp;&nbsp;<br>
<br>
我们的数据结构是这样的&nbsp;&nbsp;<br>
<br>
以下是<a href="http://hi.baidu.com/yufengshop/blog/item/%20:;" target="_self"><u><strong> <font color="#800080">代码</font></strong> </u></a>：&nbsp;&nbsp;<br>
</p>
<pre><br>Food<br><br>|<br><br>|---Fruit<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; |---Red<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |--Cherry<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; |---Yellow<br><br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--Banana<br><br>|<br><br>|---Meat<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--Beef<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--Pork<br><br></pre>
<p><br>
<br>
为了照顾那些英文一塌糊涂的PHP爱好者&nbsp;&nbsp;<br>
Food:食物&nbsp;&nbsp;<br>
Fruit:水果&nbsp;&nbsp;<br>
Red:红色&nbsp;&nbsp;<br>
Cherry:樱桃&nbsp;&nbsp;<br>
Yellow:黄色&nbsp;&nbsp;<br>
Banana:香蕉&nbsp;&nbsp;<br>
Meat:肉类&nbsp;&nbsp;<br>
Beef:牛肉&nbsp;&nbsp;<br>
Pork:猪肉&nbsp;&nbsp;<br>
<br>
<br>
毗邻目录模式(adjacency list model)&nbsp;&nbsp;<br>
这种模式我们经常用到，很多的教程和书中也介绍过。我们通过给每个节点增加一个属性 parent 来表示这个节点的父节点从而将整个树状结构通过平面的表描述出来。根据这个原则，例子中的数据可以转化成如下的表：&nbsp;&nbsp;<br>
<br>
以下是代码：&nbsp;&nbsp;<br>
</p>
<pre><br>+-----------------------+<br><br>|&nbsp;&nbsp;&nbsp; parent |&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>+-----------------------+<br><br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Food&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Food&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; Fruit&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Fruit&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Green&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Green&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Pear&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Fruit&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Red&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Red&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Cherry&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Fruit&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Yellow&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Yellow |&nbsp;&nbsp;&nbsp;&nbsp; Banana&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Food&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Meat&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Meat&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Beef&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Meat&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Pork&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>+-----------------------+<br><br></pre>
<p><br>
<br>
<br>
我们看到 Pear 是Green的一个子节点，Green是Fruit的一个子节点。而根节点'Food'没有父节点。 为了简单地描述这个问题，
这个例子中只用了name来表示一个记录。 在实际的数据库中，你需要用数字的id来标示每个节点，数据库的表结构大概应该像这样：id,
parent_id, name, descrīption。&nbsp;&nbsp;<br>
有了这样的表我们就可以通过数据库保存整个多级树状结构了。&nbsp;&nbsp;<br>
<br>
显示多级树&nbsp;&nbsp;<br>
如果我们需要显示这样的一个多级结构需要一个递归函数。&nbsp;&nbsp;<br>
<br>
以下是代码：&nbsp;&nbsp;<br>
</p>
<pre><br>&lt;?php<br><br>// $parent is the parent of the children we want to see<br><br>// $level is increased when we go deeper into the tree,<br><br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used to display a nice indented tree<br><br><br><br>function display_children($parent, $level) <br><br>{<br><br>&nbsp;&nbsp;&nbsp; // 获得一个 父节点 $parent 的所有子节点<br><br>&nbsp;&nbsp;&nbsp; $result = mysql_query('SELECT name FROM tree '.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'WHERE parent="'.$parent.'";');<br><br><br><br>&nbsp;&nbsp;&nbsp; // 显示每个子节点<br><br>&nbsp;&nbsp;&nbsp; while ($row = mysql_fetch_array($result)) <br><br>&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 缩进显示节点名称<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo str_repeat('&nbsp;&nbsp; ',$level).$row['name']."n";<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //再次调用这个函数显示子节点的子节点<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display_children($row['name'], $level+1);<br><br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>?&gt;;<br><br></pre>
<p><br>
<br>
对整个结构的根节点（Food）使用这个函数就可以打印出整个多级树结构，由于Food是根节点它的父节点是空的，所以这样调用: display_children('',0)。将显示整个树的内容：&nbsp;&nbsp;<br>
</p>
<pre><br>Food <br><br>Fruit <br><br> Red <br><br>&nbsp;&nbsp; Cherry <br><br> Yellow <br><br>&nbsp;&nbsp; Banana <br><br>Meat <br><br> Beef <br><br> Pork <br><br></pre>
<p><br>
如果你只想显示整个结构中的一部分，比如说水果部分，就可以这样调用：display_children('Fruit',0);&nbsp;&nbsp;<br>
<br>
几乎使用同样的方法我们可以知道从根节点到任意节点的路径。比如 Cherry 的路径是　"Food &gt;; Fruit &gt;;
Red"。 为了得到这样的一个路径我们需要从最深的一级"Cherry"开始， 查询得到它的父节点"Red"把它添加到路径中，
然后我们再查询Red的父节点并把它也添加到路径中，以此类推直到最高层的"Food"&nbsp;&nbsp;<br>
<br>
以下是代码：&nbsp;&nbsp;<br>
</p>
<pre><br>&lt;?php<br><br>// $node 是那个最深的节点<br><br>function get_path($node) <br><br>{<br><br>&nbsp;&nbsp;&nbsp; // 查询这个节点的父节点<br><br>&nbsp;&nbsp;&nbsp; $result = mysql_query('SELECT parent FROM tree '.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'WHERE name="'.$node.'";');<br><br>&nbsp;&nbsp;&nbsp; $row = mysql_fetch_array($result);<br><br><br><br>&nbsp;&nbsp;&nbsp; // 用一个数组保存路径<br><br>&nbsp;&nbsp;&nbsp; $path = array();<br><br><br><br>&nbsp;&nbsp;&nbsp; // 如果不是根节点则继续向上查询<br><br>&nbsp;&nbsp;&nbsp; // (根节点没有父节点)<br><br>&nbsp;&nbsp;&nbsp; if ($row['parent']!='') <br><br>&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the last part of the path to $node, is the name<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // of the parent of $node<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $path[] = $row['parent'];<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // we should add the path to the parent of this node<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // to the path<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $path = array_merge(get_path($row['parent']), $path);<br><br>&nbsp;&nbsp;&nbsp; }<br><br><br><br>&nbsp;&nbsp;&nbsp; // return the path<br><br>&nbsp;&nbsp;&nbsp; return $path;<br><br>}<br><br>?&gt;;<br><br></pre>
<p><br>
<br>
如果对"Cherry"使用这个函数：print_r(get_path('Cherry'))，就会得到这样的一个数组了：&nbsp;&nbsp;<br>
</p>
<pre><br>Array <br><br>( <br><br>&nbsp;&nbsp; [0] =&gt;; Food <br><br>&nbsp;&nbsp; [1] =&gt;; Fruit <br><br>&nbsp;&nbsp; [2] =&gt;; Red <br><br>) <br><br></pre>
<p><br>
接下来如何把它打印成你希望的格式，就是你的事情了。&nbsp;&nbsp;<br>
<br>
缺点：&nbsp;&nbsp;<br>
这种方法很简单，容易理解，好上手。但是也有一些缺点。主要是因为运行速度很慢，由于得到每个节点都需要进行数据库查询，数据量大的时候要进行很多查询才能完成一个树。另外由于要进行递归运算，递归的每一级都需要占用一些内存所以在空间利用上效率也比较低。&nbsp;&nbsp;<br>
<br>
现在让我们看一看另外一种不使用递归计算，更加快速的方法，这就是预排序遍历树算法(modified preorder tree traversal algorithm)&nbsp;&nbsp;<br>
这种方法大家可能接触的比较少，初次使用也不像上面的方法容易理解，但是由于这种方法不使用递归查询算法，有更高的查询效率。&nbsp;&nbsp;<br>
<br>
我们首先将多级数据按照下面的方式画在纸上，在根节点Food的左侧写上 1 然后沿着这个树继续向下 在 Fruit 的左侧写上 2
然后继续前进，沿着整个树的边缘给每一个节点都标上左侧和右侧的数字。最后一个数字是标在Food 右侧的 18。
在下面的这张图中你可以看到整个标好了数字的多级结构。（没有看懂？用你的手指指着数字从1数到18就明白怎么回事了。还不明白，再数一遍，注意移动你的
手指）。&nbsp;&nbsp;<br>
这些数字标明了各个节点之间的关系，"Red"的号是3和6，它是 "Food" 1-18 的子孙节点。 同样，我们可以看到 所有左值大于2和右值小于11的节点 都是"Fruit" 2-11 的子孙节点&nbsp;&nbsp;<br>
<br>
以下是代码：&nbsp;&nbsp;<br>
</p>
<pre><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Food 18<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +-------------------------------------------+<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 Fruit 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12 Meat 17<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>&nbsp;&nbsp;&nbsp;&nbsp; +------------------------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +-----------------------+<br><br>&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br> 3 Red 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 Yellow 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13 Beef 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15 Pork 16<br><br>&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>4 Cherry 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 Banana 9<br><br></pre>
<p><br>
<br>
这样整个树状结构可以通过左右值来存储到数据库中。继续之前，我们看一看下面整理过的数据表。&nbsp;&nbsp;<br>
<br>
以下是代码：&nbsp;&nbsp;<br>
</p>
<pre><br>+-----------------------+-----+-----+<br><br>|&nbsp;&nbsp;&nbsp; parent |&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp; | lft&nbsp;&nbsp;&nbsp; | rgt |<br><br>+-----------------------+-----+-----+<br><br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Food&nbsp;&nbsp;&nbsp;&nbsp; | 1&nbsp;&nbsp;&nbsp; | 18&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Food&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; Fruit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 2&nbsp;&nbsp;&nbsp; | 11&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Fruit&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Red&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 3&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 6&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Red&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Cherry&nbsp;&nbsp; | 4&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 5&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Fruit&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Yellow&nbsp;&nbsp; | 7&nbsp;&nbsp;&nbsp; | 10&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Yellow |&nbsp;&nbsp;&nbsp;&nbsp; Banana | 8&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 9&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Food&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Meat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 12&nbsp;&nbsp; | 17&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Meat&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Beef&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 13&nbsp;&nbsp; | 14&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Meat&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; Pork&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 15&nbsp;&nbsp; | 16&nbsp;&nbsp; |<br><br>+-----------------------+-----+-----+<br><br></pre>
<p><br>
<br>
注意：由于"left"和"right"在 SQL中有特殊的意义，所以我们需要用"lft"和"rgt"来表示左右字段。 另外这种结构中不再需要"parent"字段来表示树状结构。也就是 说下面这样的表结构就足够了。&nbsp;&nbsp;<br>
<br>
以下是代码：&nbsp;&nbsp;<br>
</p>
<pre><br>+------------+-----+-----+<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp; | lft | rgt |<br><br>+------------+-----+-----+<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Food&nbsp;&nbsp;&nbsp;&nbsp; | 1&nbsp;&nbsp;&nbsp; | 18&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Fruit&nbsp;&nbsp;&nbsp;&nbsp; | 2&nbsp;&nbsp;&nbsp; | 11&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Red&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 3&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 6&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Cherry&nbsp;&nbsp; | 4&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 5&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Yellow&nbsp;&nbsp; | 7&nbsp;&nbsp;&nbsp; | 10&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Banana&nbsp;&nbsp; | 8&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 9&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Meat&nbsp;&nbsp;&nbsp;&nbsp; | 12&nbsp;&nbsp; | 17&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Beef&nbsp;&nbsp;&nbsp;&nbsp; | 13&nbsp;&nbsp; | 14&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Pork&nbsp;&nbsp;&nbsp;&nbsp; | 15&nbsp;&nbsp; | 16&nbsp;&nbsp; |<br><br>+------------+-----+-----+<br><br></pre>
<p><br>
<br>
好了我们现在可以从数据库中获取数据了，例如我们需要得到"Fruit"项下的所有所有节点就可以这样写查询语句：&nbsp;&nbsp;<br>
SELECT * FROM tree WHERE lft BETWEEN 2 AND 11;&nbsp;&nbsp;<br>
这个查询得到了以下的结果。&nbsp;&nbsp;<br>
<br>
以下是代码：&nbsp;&nbsp;<br>
</p>
<pre><br>+------------+-----+-----+<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp; | lft | rgt |<br><br>+------------+-----+-----+<br><br>|&nbsp;&nbsp;&nbsp; Fruit&nbsp;&nbsp;&nbsp;&nbsp; | 2&nbsp;&nbsp;&nbsp; | 11&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Red&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 3&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 6&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Cherry&nbsp;&nbsp; | 4&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 5&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Yellow&nbsp;&nbsp; | 7&nbsp;&nbsp;&nbsp; | 10&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Banana&nbsp;&nbsp; | 8&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 9&nbsp;&nbsp; |<br><br>+------------+-----+-----+<br><br></pre>
<p><br>
<br>
<br>
看到了吧，只要一个查询就可以得到所有这些节点。为了能够像上面的递归函数那样显示整个树状结构，我们还需要对这样的查询进行排序。用节点的左值进行排序：&nbsp;&nbsp;<br>
<br>
SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;&nbsp;&nbsp;<br>
<br>
<br>
剩下的问题如何显示层级的缩进了。&nbsp;&nbsp;<br>
<br>
以下是代码：&nbsp;&nbsp;<br>
</p>
<pre><br>&lt;?php<br><br>function display_tree($root) <br><br>{<br><br>&nbsp;&nbsp;&nbsp; // 得到根节点的左右值<br><br>&nbsp;&nbsp;&nbsp; $result = mysql_query('SELECT lft, rgt FROM tree '.'WHERE name="'.$root.'";');<br><br>&nbsp;&nbsp;&nbsp; $row = mysql_fetch_array($result);<br><br><br><br>&nbsp;&nbsp;&nbsp; // 准备一个空的右值堆栈<br><br>&nbsp;&nbsp;&nbsp; $right = array();<br><br><br><br>&nbsp;&nbsp;&nbsp; // 获得根基点的所有子孙节点<br><br>&nbsp;&nbsp;&nbsp; $result = mysql_query('SELECT name, lft, rgt FROM tree '.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'WHERE lft BETWEEN '.$row['lft'].' AND '.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $row['rgt'].' ORDER BY lft ASC;');<br><br><br><br>&nbsp;&nbsp;&nbsp; // 显示每一行<br><br>&nbsp;&nbsp;&nbsp; while ($row = mysql_fetch_array($result)) <br><br>&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // only check stack if there is one<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (count($right)&gt;;0) <br><br>&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 检查我们是否应该将节点移出堆栈<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ($right[count($right)-1]&lt;$row['rgt']) <br><br>&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array_pop($right);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 缩进显示节点的名称<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo str_repeat('&nbsp;&nbsp; ',count($right)).$row['name']."n";<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将这个节点加入到堆栈中<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $right[] = $row['rgt'];<br><br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>?&gt;;<br><br></pre>
<p><br>
<br>
如果你运行一下以上的函数就会得到和递归函数一样的结果。只是我们的这个新的函数可能会更快一些，因为只有2次数据库查询。&nbsp;&nbsp;<br>
<br>
要获知一个节点的路径就更简单了，如果我们想知道Cherry 的路径就利用它的左右值4和5来做一个查询。&nbsp;&nbsp;<br>
<br>
SELECT name FROM tree WHERE lft &lt; 4 AND rgt &gt;; 5 ORDER BY lft ASC;&nbsp;&nbsp;<br>
<br>
这样就会得到以下的结果：&nbsp;&nbsp;<br>
<br>
以下是代码：&nbsp;&nbsp;<br>
</p>
<pre><br>+------------+<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>+------------+<br><br>|&nbsp;&nbsp;&nbsp; Food&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp; Fruit&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>|&nbsp;&nbsp;&nbsp;&nbsp; Red&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br><br>+------------+<br><br></pre>
<p><br>
<br>
那么某个节点到底有多少子孙节点呢？很简单，子孙总数=(右值-左值-1)/2&nbsp;&nbsp;<br>
descendants = (right &#8211; left - 1) / 2&nbsp;&nbsp;<br>
不相信？自己算一算啦。&nbsp;&nbsp;<br>
用这个简单的公式，我们可以很快的算出"Fruit 2-11"节点有4个子孙节点，而"Banana 8-9"节点没有子孙节点，也就是说它不是一个父节点了。&nbsp;&nbsp;<br>
<br>
很神奇吧？虽然我已经多次用过这个方法，但是每次这样做的时候还是感到很神奇。&nbsp;&nbsp;<br>
<br>
这的确是个很好的办法，但是有什么办法能够帮我们建立这样有左右值的数据表呢？这里再介绍一个函数给大家，这个函数可以将name和parent结构的表自动转换成带有左右值的数据表。&nbsp;&nbsp;<br>
<br>
以下是代码：&nbsp;&nbsp;<br>
</p>
<pre><br>&lt;?php<br><br>function rebuild_tree($parent, $left) {<br><br>&nbsp;&nbsp;&nbsp; // the right value of this node is the left value + 1<br><br>&nbsp;&nbsp;&nbsp; $right = $left+1;<br><br><br><br>&nbsp;&nbsp;&nbsp; // get all children of this node<br><br>&nbsp;&nbsp;&nbsp; $result = mysql_query('SELECT name FROM tree '.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'WHERE parent="'.$parent.'";');<br><br>&nbsp;&nbsp;&nbsp; while ($row = mysql_fetch_array($result)) {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // recursive execution of this function for each<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // child of this node<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // $right is the current right value, which is<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // incremented by the rebuild_tree function<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $right = rebuild_tree($row['name'], $right);<br><br>&nbsp;&nbsp;&nbsp; }<br><br><br><br>&nbsp;&nbsp;&nbsp; // we've got the left value, and now that we've processed<br><br>&nbsp;&nbsp;&nbsp; // the children of this node we also know the right value<br><br>&nbsp;&nbsp;&nbsp; mysql_query('UPDATE tree SET lft='.$left.', rgt='.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $right.' WHERE name="'.$parent.'";');<br><br><br><br>&nbsp;&nbsp;&nbsp; // return the right value of this node + 1<br><br>&nbsp;&nbsp;&nbsp; return $right+1;<br><br>}<br><br>?&gt;;<br><br></pre>
<br>
<br>
当然这个函数是一个递归函数，我们需要从根节点开始运行这个函数来重建一个带有左右值的树&nbsp;&nbsp;<br>
<br>
rebuild_tree('Food',1);&nbsp;&nbsp;<br>
<br>
这个函数看上去有些复杂，但是它的作用和手工对表进行编号一样，就是将立体多层结构的转换成一个带有左右值的数据表。&nbsp;&nbsp;<br>
<br>
那么对于这样的结构我们该如何增加，更新和删除一个节点呢？&nbsp;&nbsp;<br>
<br>
增加一个节点一般有两种方法：&nbsp;&nbsp;<br>
<br>
第一种，保留原有的name 和parent结构，用老方法向数据中添加数据，每增加一条数据以后使用rebuild_tree函数对整个结构重新进行一次编号。&nbsp;&nbsp;<br>
<br>
第二种，效率更高的办法是改变所有位于新节点右侧的数值。举例来说：我们想增加一种新的水果"Strawberry"（草莓）它将成为"Red"节点的最
后一个子节点。首先我们需要为它腾出一些空间。"Red"的右值应当从6改成8，"Yellow 7-10 "的左右值则应当改成 9-12。
依次类推我们可以得知，如果要给新的值腾出空间需要给所有左右值大于5的节点 （5 是"Red"最后一个子节点的右值） 加上2。
所以我们这样进行数据库操作：&nbsp;&nbsp;<br>
<br>
UPDATE tree SET rgt=rgt+2 WHERE rgt&gt;;5;&nbsp;&nbsp;<br>
UPDATE tree SET lft=lft+2 WHERE lft&gt;;5;&nbsp;&nbsp;<br>
<br>
这样就为新插入的值腾出了空间，现在可以在腾出的空间里建立一个新的数据节点了， 它的左右值分别是6和7&nbsp;&nbsp;<br>
<br>
INSERT INTO tree SET lft=6, rgt=7, name='Strawberry';&nbsp;&nbsp;<br>
<br>
再做一次查询看看吧！怎么样？很快吧。&nbsp;&nbsp;<br>
<br>
好了，现在你可以用两种不同的方法设计你的多级数据库结构了，采用何种方式完全取决于你个人的判断，但是对于层次多数量大的结构我更喜欢第二种方法。如果查询量较小但是需要频繁添加和更新的数据，则第一种方法更为简便。&nbsp;&nbsp;<br>
<br>
另外，如果数据库支持的话 你还可以将rebuild_tree()和 腾出空间的操作写成数据库端的触发器函数， 在插入和更新的时候自动执行， 这样可以得到更好的运行效率， 而且你添加新节点的SQL语句会变得更加简单。
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-09-02 13:38 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/09/02/5695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计经验谈</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/08/30/5685.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Sat, 30 Aug 2008 07:23:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/08/30/5685.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5685.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/08/30/5685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5685.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5685.html</trackback:ping><description><![CDATA[一个成功的管理系统，是由：[50% 的业务 + 50% 的软件] 所组成，而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成，数据库设计的好坏是一个关键。如果把企业的数据比做生命所必需的血液，那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋，大学学位课程里也有专门的讲述。不过，就如我们反复强调的那样，再好的老师也比不过经验的教诲。所以我归纳历年来所走的弯路及体会，并在网上找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验。精选了其中的 60 个最佳技巧，并把这些技巧编写成了本文，为了方便索引其内容划分为 5 个部分： <font color=#ffffff>phperz~com</font>
<p>第 1 部分 - 设计数据库之前<br>这一部分罗列了 12 个基本技巧，包括命名规范和明确业务需求等。 <span class=Ujw253>php程序员站</span> </p>
<p>第 2 部分 - 设计数据库表<br>总共 24 个指南性技巧，涵盖表内字段设计以及应该避免的常见问题等。
<div class=Ujw253>phperz.com</div>
<p>&nbsp;</p>
<p>第 3 部分 - 选择键<br>怎么选择键呢？这里有 10 个技巧专门涉及系统生成的主键的正确用法，还有何 时以及如何索引字段以获得最佳性能等。 <span class=Ujw253>www~phperz~com</span> </p>
<p>第 4 部分 - 保证数据完整性<br>讨论如何保持数据库的清晰和健壮，如何把有害数据降低到最小程度。 <span class=Ujw253>phperz.com</span> </p>
<p>第 5 部分 - 各种小技巧<br>不包括在以上 4 个部分中的其他技巧，五花八门，有了它们希望你的数据库开发工作会更轻松一些。<br><br><strong>第 1 部分 - 设计数据库之前</strong><br><br><strong>考察现有环境</strong><br><br>　　在设计一个新数据库时，你不但应该仔细研究业务需求而且还要考察现有的系统。大多数数据库项目都不是从头开始建立的；通常，机构内总会存在用来满足特定需求的现有系统（可能没有实现自动计算）。显然，现有系统并不完美，否则你就不必再建立新系统了。但是对旧系统的研究可以让你发现一些可能会忽略的细微问题。一般来说，考察现有系统对你绝对有好处。 <br><br><br><strong>定义标准的对象命名规范</strong><br><br>　　一定要定义数据库对象的命名规范。对数据库表来说，从项目一开始就要确定表名是采用复数还是单数形式。此外还要给表的别名定义简单规则（比方说，如果表名是一个单词，别名就取单词的前 4 个字母；如果表名是两个单词，就各取两个单词的前两个字母组成 4 个字母长的别名；如果表的名字由 3 个单词组成，你不妨从头两个单词中各取一个然后从最后一个单词中再取出两个字母，结果还是组成 4 字母长的别名，其余依次类推）对工作用表来说，表名可以加上前缀 WORK_ 后面附上采用该表的应用程序的名字。表内的列[字段]要针对键采用一整套设计规则。比如，如果键是数字类型，你可以用 _N 作为后缀；如果是字符类型则可以采用 _C 后缀。对列[字段]名应该采用标准的前缀和后缀。再如，假如你的表里有好多&#8220;money&#8221;字段，你不妨给每个列[字段]增加一个 _M 后缀。还有，日期列[字段]最好以 D_ 作为名字打头。
<p class=Ujw253>phperz~com</p>
<br><br>　　检查表名、报表名和查询名之间的命名规范。你可能会很快就被这些不同的数据库要素的名称搞糊涂了。假如你坚持统一地命名这些数据库的不同组成部分，至少你应该在这些对象名字的开头用 Table、Query 或者 Report 等前缀加以区别。<br><br>　　如果采用了 Microsoft Access，你可以用 qry、rpt、tbl 和 mod 等符号来标识对象（比如 tbl_Employees）。我在和 SQL Server 打交道的时候还用过 tbl 来索引表，但我用 sp_company （现在用 sp_feft_）标识存储过程，因为在有的时候如果我发现了更好的处理办法往往会保存好几个拷贝。我在实现 SQL Server 2000 时用 udf_ （或者类似的标记）标识我编写的函数。<br><br><br><strong>工欲善其事, 必先利其器</strong><br><br>　　采用理想的数据库设计工具，比如：SyBase 公司的 PowerDesign，她支持 PB、VB、Delphe 等语言，通过 ODBC 可以连接市面上流行的 30 多个数据库，包括 dBase、FoxPro、VFP、SQL Server 等，今后有机会我将着重介绍 PowerDesign 的使用。
<p class=Ujw253>www.phperz.com</p>
<p>&nbsp;</p>
<p><strong>获取数据模式资源手册<br><br></strong>　　正在寻求示例模式的人可以阅读《数据模式资源手册》一书，该书由 Len Silverston、W. H. Inmon 和 Kent Graziano 编写，是一本值得拥有的最佳数据建模图书。该书包括的章节涵盖多种数据领域，比如人员、机构和工作效能等。其他的你还可以参考相关书籍。 <br><br><br><strong>畅想未来，但不可忘了过去的教训</strong><br><br>　　我发现询问用户如何看待未来需求变化非常有用。这样做可以达到两个目的：首先，你可以清楚地了解应用设计在哪个地方应该更具灵活性以及如何避免性能瓶颈；其次，你知道发生事先没有确定的需求变更时用户将和你一样感到吃惊。<br><br>　　一定要记住过去的经验教训！我们开发人员还应该通过分享自己的体会和经验互相帮助。即使用户认为他们再也不需要什么支持了，我们也应该对他们进行这方面的教育，我们都曾经面临过这样的时刻&#8220;当初要是这么做了该多好..&#8221;。 <br><br><br><strong>在物理实践之前进行逻辑设计</strong><br><br>　　在深入物理设计之前要先进行逻辑设计。随着大量的 CASE 工具不断涌现出来，你的设计也可以达到相当高的逻辑水准，你通常可以从整体上更好地了解数据库设计所需要的方方面面。
<p class=Ujw253>phperz.com</p>
<br><br><br><strong>了解你的业务</strong><br><br>　　在你百分百地确定系统从客户角度满足其需求之前不要在你的 ER（实体关系）模式中加入哪怕一个数据表（怎么，你还没有模式？那请你参看技巧 9）。了解你的企业业务可以在以后的开发阶段节约大量的时间。一旦你明确了业务需求，你就可以自己做出许多决策了。<br><br>　　一旦你认为你已经明确了业务内容，你最好同客户进行一次系统的交流。采用客户的术语并且向他们解释你所想到的和你所听到的。同时还应该用可能、将会和必须等词汇表达出系统的关系基数。这样你就可以让你的客户纠正你自己的理解然后做好下一步的 ER 设计。 <br><br><br><strong>创建数据字典和 ER 图表<br></strong><br>　　一定要花点时间创建 ER 图表和数据字典。其中至少应该包含每个字段的数据类型和在每个表内的主外键。创建 ER 图表和数据字典确实有点费时但对其他开发人员要了解整个设计却是完全必要的。越早创建越能有助于避免今后面临的可能混乱，从而可以让任何了解数据库的人都明确如何从数据库中获得数据。<br><br>　　有一份诸如 ER 图表等最新文档其重要性如何强调都不过分，这对表明表之间关系很有用，而数据字典则说明了每个字段的用途以及任何可能存在的别名。对 SQL 表达式的文档化来说这是完全必要的。 <font color=#ffffff>phperz~com</font> <br><br><br><strong>创建模式</strong><br><br>　　一张图表胜过千言万语：开发人员不仅要阅读和实现它，而且还要用它来帮助自己和用户对话。模式有助于提高协作效能，这样在先期的数据库设计中几乎不可能出现大的问题。模式不必弄的很复杂；甚至可以简单到手写在一张纸上就可以了。只是要保证其上的逻辑关系今后能产生效益。 <br><br><br><strong>从输入输出下手</strong><br><br>　　在定义数据库表和字段需求（输入）时，首先应检查现有的或者已经设计出的报表、查询和视图（输出）以决定为了支持这些输出哪些是必要的表和字段。举个简单的例子：假如客户需要一个报表按照邮政编码排序、分段和求和，你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。 <br><br><br><strong>报表技巧<br></strong><br>　　要了解用户通常是如何报告数据的：批处理还是在线提交报表？时间间隔是每天、每周、每月、每个季度还是每年？如果需要的话还可以考虑创建总结表。系统生成的主键在报表中很难管理。用户在具有系统生成主键的表内用副键进行检索往往会返回许多重复数据。这样的检索性能比较低而且容易引起混乱。 <br><br><br><strong>理解客户需求</strong>
<p class=Ujw253>phperz.com</p>
<br><br>　　看起来这应该是显而易见的事，但需求就是来自客户（这里要从内部和外部客户的角度考虑）。不要依赖用户写下来的需求，真正的需求在客户的脑袋里。你要让客户解释其需求，而且随着开发的继续，还要经常询问客户保证其需求仍然在开发的目的之中。一个不变的真理是：&#8220;只有我看见了我才知道我想要的是什么&#8221;必然会导致大量的返工，因为数据库没有达到客户从来没有写下来的需求标准。而更糟的是你对他们需求的解释只属于你自己，而且可能是完全错误的。 <span class=Ujw253>phperz.com</span>
<p>&nbsp;</p>
<p>　　<a href="http://www.phperz.com/database/MySQL/0309109420081094.html">其余四部分</a></p><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-08-30 15:23 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/08/30/5685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL怎样优化WHERE子句</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/08/27/5669.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Wed, 27 Aug 2008 08:56:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/08/27/5669.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5669.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/08/27/5669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5669.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5669.html</trackback:ping><description><![CDATA[<div class=section>
<div class=titlepage>
<div>
<div>
<h3 class=title>SELECT查询的速度</h3>
</div>
</div>
</div>
<a class=indexterm name=id2802441></a><a class=indexterm name=id2802450></a>
<p>总的来说，要想使一个较慢速<span>SELECT ... WHERE</span>更快，应首先检查是否能增加一个索引。不同表之间的引用通常通过索引来完成。你可以使用<span>EXPLAIN</span>语句来确定<span>SELECT</span>语句使用哪些索引。参见<a title="7.4.5.&nbsp;How MySQL Uses Indexes" href="mk:@MSITStore:C:\Documents%20and%20Settings\网博\桌面\手册\mysql5.chm::/optimization.html#mysql-indexes">7.4.5节，&#8220;MySQL如何使用索引&#8221;</a>和<a title="7.2.1.&nbsp;EXPLAIN Syntax (Get Information About a SELECT)" href="mk:@MSITStore:C:\Documents%20and%20Settings\网博\桌面\手册\mysql5.chm::/optimization.html#explain">7.2.1节，&#8220;EXPLAIN语法（获取关于SELECT的信息）<code class=literal></code>&#8221;</a>。</p>
<p>下面是一些加速对<span>MyISAM</span>表的查询的一般建议：</p>
<p><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>为了帮助<strong><span>MySQL</span></strong>更好地优化查询，在一个装载数据后的表上运行<span>ANALYZE TABLE</span>或<strong><span>myisamchk --analyze</span></strong>。这样为每一个索引更新指出有相同值的行的平均行数的值（当然，如果只有一个索引，这总是<span>1</span>。）<span>MySQL</span>使用该方法来决定当你联接两个基于非常量表达式的表时选择哪个索引。你可以使用<span>SHOW INDEX FROM <em>tbl_name</em></span>并检查<span>Cardinality</span>值来检查表分析结果。<strong><span>myisamchk --</span><span>description --verbose</span></strong>可以显示索引分布信息。</p>
<p><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>要想根据一个索引排序一个索引和数据，使用<strong><span>myisamchk --sort-index --sort-records=1</span></strong>（如果你想要在索引<span>1</span>上排序）。如果只有一个索引，想要根据该索引的次序读取所有的记录，这是使查询更快的一个好方法。但是请注意，第一次对一个大表按照这种方法排序时将花很长时间！</p>
</div>
<div class=section>
<div class=titlepage>
<div>
<div>
<h3 class=title><a name=where-optimizations></a>7.2.4.&nbsp;MySQL怎样优化WHERE子句<code class=literal></code></h3>
</div>
</div>
</div>
<a class=indexterm name=id2802573></a><a class=indexterm name=id2802582></a></div>
<div class=section>
<div class=titlepage>
<div>
<div>
<p>该节讨论为处理<span>WHERE</span>子句而进行的优化。例子中使用了<span>SELECT</span>语句，但相同的优化也适用<span>DELETE</span>和<span>UPDATE</span>语句中的<span>WHERE</span>子句。</p>
<p>请注意对<span>MySQL</span>优化器的工作在不断进行中，因此该节并不完善。<span>MySQL</span>执行了大量的优化，本文中所列的并不详尽。</p>
<p>下面列出了<span>MySQL</span>执行的部分优化：</p>
<p><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>去除不必要的括号：</p>
<pre><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;((a AND b) AND c OR (((a AND b) AND (c AND d))))</span></pre>
<pre><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>-&gt; (a AND b AND c) OR (a AND b AND c AND d)</span></pre>
<p><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>常量重叠：</p>
<pre><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&nbsp;&nbsp;&nbsp;(a&lt;b AND b=c) AND a=5</span></pre>
<pre><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>-&gt; b&gt;5 AND b=c AND a=5</span></pre>
<p><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>去除常量条件<span>(</span>由于常量重叠需要<span>)</span>：</p>
<pre><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&nbsp;&nbsp;&nbsp;(B&gt;=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)</span></pre>
<pre><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>-&gt; B=5 OR B=6</span></pre>
<p><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>索引使用的常数表达式仅计算一次。</p>
<ul type=disc>
    <li>对于<span>MyISAM</span>和<span>HEAP</span>表，在一个单个表上的没有一个<span>WHERE</span>的<span>COUNT(*)</span>直接从表中检索信息。当仅使用一个表时，对<span>NOT NULL</span>表达式也这样做。
    <li>无效常数表达式的早期检测。<strong><span>MySQL</span></strong>快速检测某些<span>SELECT</span>语句是不可能的并且不返回行。
    <li>如果不使用<span>GROUP BY</span>或分组函数<span>(</span><span>COUNT()</span>、<span>MIN()</span>&#8230;&#8230;<span>)</span>，<span>HAVING</span>与<span>WHERE</span>合并。
    <li>对于联接内的每个表，构造一个更简单的<span>WHERE</span>以便更快地对表进行<span>WHERE</span>计算并且也尽快跳过记录。
    <li>所有常数的表在查询中比其它表先读出。常数表为：
    <ul type=circle>
        <li>空表或只有<span>1</span>行的表。
        <li>与在一个<span>PRIMARY KEY</span>或<span>UNIQUE</span>索引的<span>WHERE</span>子句一起使用的表，这里所有的索引部分使用常数表达式并且索引部分被定义为<span>NOT NULL</span>。 </li>
    </ul>
    </li>
</ul>
<p>下列的所有表用作常数表： </p>
<pre><span>mysql&gt; SELECT * FROM t WHERE primary_key=1;</span></pre>
<pre><span>mysql&gt; SELECT * FROM t1,t2</span></pre>
<pre><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE t1.primary_key=1 AND t2.primary_key=t1.id;</span></pre>
<ul type=disc>
    <li>尝试所有可能性便可以找到表联接的最好联接组合。如果所有在<span>ORDER BY</span>和<span>GROUP BY</span>的列来自同一个表，那么当联接时，该表首先被选中。
    <li>如果有一个<span>ORDER BY</span>子句和不同的<span>GROUP BY</span>子句，或如果<span>ORDER BY</span>或<span>GROUP BY</span>包含联接队列中的第一个表之外的其它表的列，则创建一个临时表。
    <li>如果使用<span>SQL_SMALL_RESULT</span>，<strong><span>MySQL</span></strong>使用内存中的一个临时表。
    <li>每个表的索引被查询，并且使用最好的索引，除非优化器认为使用表扫描更有效。是否使用扫描取决于是否最好的索引跨越超过<span>30%</span>的表。优化器更加复杂，其估计基于其它因素，例如表大小、行数和<span>I/O</span>块大小，因此固定比例不再决定选择使用索引还是扫描。
    <li>在一些情况下，<strong><span style="FONT-WEIGHT: normal">MySQL</span></strong>能从索引中读出行，甚至不查询数据文件。如果索引使用的所有列是数值类，那么只使用索引树来进行查询。
    <li>输出每个记录前，跳过不匹配<span>HAVING</span>子句的行。 </li>
</ul>
</div>
</div>
</div>
</div><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-08-27 16:56 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/08/27/5669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql  插入数据 LOAD DATA 的用法</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/08/27/5667.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Wed, 27 Aug 2008 04:02:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/08/27/5667.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5667.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/08/27/5667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5667.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5667.html</trackback:ping><description><![CDATA[<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="loading-tables"></a>
</div>
</div>
</div>
<a class="indexterm" name="id2734617"></a><a class="indexterm" name="id2734627"></a><a class="indexterm" name="id2734637"></a>
<p>创建一个空表后，需要填入内容。通过<span style="color: red;">LOAD DATA</span>和<span style="color: red;">INSERT</span>语句可以完成该任务。</p>
<p>假定你的宠物纪录描述如下。（假定在<strong> MySQL</strong> 中期望的日期格式是YYYY-MM-DD；这可能与你习惯的不同。）</p>
<table id="table2" border="1" cellpadding="0">
    <tbody>
        <tr>
            <td>
            <p><strong> name</strong> </p>
            </td>
            <td>
            <p><strong> owner</strong> </p>
            </td>
            <td>
            <p><strong> species</strong> </p>
            </td>
            <td>
            <p><strong> sex</strong> </p>
            </td>
            <td>
            <p><strong> birth</strong> </p>
            </td>
            <td>
            <p><strong> death</strong> </p>
            </td>
        </tr>
        <tr>
            <td>
            <p>Fluffy</p>
            </td>
            <td>
            <p>Harold</p>
            </td>
            <td>
            <p>cat</p>
            </td>
            <td>
            <p>f</p>
            </td>
            <td>
            <p>1993-02-04</p>
            </td>
            <td>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p>Claws</p>
            </td>
            <td>
            <p>Gwen</p>
            </td>
            <td>
            <p>cat</p>
            </td>
            <td>
            <p>m</p>
            </td>
            <td>
            <p>1994-03-17</p>
            </td>
            <td>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p>Buffy</p>
            </td>
            <td>
            <p>Harold</p>
            </td>
            <td>
            <p>dog</p>
            </td>
            <td>
            <p>f</p>
            </td>
            <td>
            <p>1989-05-13</p>
            </td>
            <td>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p>Fang</p>
            </td>
            <td>
            <p>Benny</p>
            </td>
            <td>
            <p>dog</p>
            </td>
            <td>
            <p>m</p>
            </td>
            <td>
            <p>1990-08-27</p>
            </td>
            <td>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p>Bowser</p>
            </td>
            <td>
            <p>Diane</p>
            </td>
            <td>
            <p>dog</p>
            </td>
            <td>
            <p>m</p>
            </td>
            <td>
            <p>1979-08-31</p>
            </td>
            <td>
            <p>1995-07-29</p>
            </td>
        </tr>
        <tr>
            <td>
            <p>Chirpy</p>
            </td>
            <td>
            <p>Gwen</p>
            </td>
            <td>
            <p>bird</p>
            </td>
            <td>
            <p>f</p>
            </td>
            <td>
            <p>1998-09-11</p>
            </td>
            <td>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p>Whistler</p>
            </td>
            <td>
            <p>Gwen</p>
            </td>
            <td>
            <p>bird</p>
            </td>
            <td>
            <p>&nbsp;</p>
            </td>
            <td>
            <p>1997-12-09</p>
            </td>
            <td>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p>Slim</p>
            </td>
            <td>
            <p>Benny</p>
            </td>
            <td>
            <p>snake</p>
            </td>
            <td>
            <p>m</p>
            </td>
            <td>
            <p>1996-04-29</p>
            </td>
            <td>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<p style="color: red;">因为你是从一个空表开始的，填充它的一个简易方法是创建一个文本文件，每个动物各一行，然后用一个语句将文件的内容装载到表中。</p>
<p style="color: red;">你可以创建一个文本文件
<tt>&#8220;pet.txt&#8221;</tt>，每行包含一个记录，用定位符(tab)把值分开，并且以CREATE
TABLE语句中列出的列次序给出。对于丢失的值(例如未知的性别，或仍然活着的动物的死亡日期)，你可以使用NULL值。为了在你的文本文件中表示这些内容，使用\N（反斜线，字母N）。例如，Whistler鸟的记录应为(这里值之间的空白是一个定位符)：</p>
<table id="table3" border="1" cellpadding="0">
    <tbody>
        <tr>
            <td>
            <p><strong> name</strong> </p>
            </td>
            <td>
            <p><strong> owner</strong> </p>
            </td>
            <td>
            <p><strong> species</strong> </p>
            </td>
            <td>
            <p><strong> sex</strong> </p>
            </td>
            <td>
            <p><strong> birth</strong> </p>
            </td>
            <td>
            <p><strong> death</strong> </p>
            </td>
        </tr>
        <tr>
            <td>
            <p>Whistler</p>
            </td>
            <td>
            <p>Gwen</p>
            </td>
            <td>
            <p>bird</p>
            </td>
            <td>
            <p>\N</p>
            </td>
            <td>
            <p>1997-12-09</p>
            </td>
            <td>
            <p>\N</p>
            </td>
        </tr>
    </tbody>
</table>
<p>要想将文本文件
<tt>&#8220;pet.txt&#8221;</tt>装载到pet表中，使用这个命令：</p>
<pre>mysql&gt; <strong>LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;</strong></pre>
<p>请注意如果用Windows中的编辑器（使用\r\n做为行的结束符）创建文件，应使用：</p>
<pre>mysql&gt; <strong>LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet</strong></pre>
<pre>&nbsp;&nbsp;&nbsp; -&gt; <strong>LINES TERMINATED BY '\r\n';</strong></pre>
<p>（在运行OS
X的Apple机上，应使用行结束符'\r'。）</p>
<p>如果你愿意，你能明确地在LOAD
DATA语句中指出列值的分隔符和行尾标记，但是默认标记是定位符和换行符。这对读入文件
<tt>&#8220;pet.txt&#8221;</tt>的语句已经足够。</p>
<p>如果该语句失败，可能是你安装的MySQL不与使用默认值的本地文件兼容。关于如何更改请参见<a title="5.6.4.&nbsp;Security issues with load data local" href="http://www.phpweblog.net/fuyongjie/admin/database-administration.html#load-data-local">5.6.4节，&#8220;LOAD DATA
LOCAL安全问题<code class="literal"></code>&#8221;</a>。</p>
<p><span style="color: red;">如果想要一次增加一个新记录，可以使用INSERT语句</span>。最简单的形式是，提供每一列的值，其顺序与CREATE
TABLE语句中列的顺序相同。假定Diane把一只新仓鼠命名为Puffball，你可以使用下面的INSERT语句添加一条新记录：</p>
<pre>mysql&gt; <strong>INSERT INTO pet</strong></pre>
<pre>&nbsp;&nbsp;&nbsp; -&gt; <strong>VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);</strong></pre>
<p>注意，这里字符串和日期值均为引号扩起来的字符串。另外，可以直接用INSERT语句插入NULL代表不存在的值。不能使用LOAD
DATA中所示的的\N。</p>
<p>从这个例子，你应该能看到涉及很多的键入用多个INSERT语句而非单个LOAD
DATA语句装载你的初始记录</p>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-08-27 12:02 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/08/27/5667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库主键设计之思考</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/07/29/5494.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Tue, 29 Jul 2008 05:50:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/07/29/5494.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5494.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/07/29/5494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5494.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5494.html</trackback:ping><description><![CDATA[<p><strong><font size="3">数据库主键设计之思考</font></strong>
</p>
<p><font size="3">在我们的数据库设计中，不可逃避的就是数据库表的主键，可能有很多朋友没有深入思考过，主键的设计对整个数据库的设计影响很大，因此我们不得不要重视起来。</font>
</p>
<p><strong><font size="3">主键的必要性<font face="Times New Roman">:</font></font></strong>
</p>
<p><font size="3">有
些朋友可能不提倡数据库表必须要主键，但在我的思考中，觉得每个表都应该具有主键，不管是单主键还是双主键，主键的存在就代表着表结构的完整性，表的记录
必须得有唯一区分的字段，主键主要是用于其他表的外键关联，本记录的修改与删除，当我们没有主键时，这些操作会变的非常麻烦。</font>
</p>
<p><font size="3"><strong>主键的无意义性</strong>：</font>
</p>
<p><font size="3">我
强调主键不应该具有实际的意义，这可能对于一些朋友来说不太认同，比如订单表吧，会有&#8220;订单编号&#8221;字段，而这个字段呢在业务实际中本身就是应该具有唯一
性，具有唯一标识记录的功能，但我是不推荐采用订单编号字段作为主键的，因为具有实际意义的字段，具有&#8220;意义更改&#8221;的可能性，比如订单编号在刚开始的时候
我们一切顺利，后来客户说&#8220;订单可以作废，并重新生成订单，而且订单号要保持原订单号一致&#8221;，这样原来的主键就面临危险了。因此，具有唯一性的实际字段也
代表可以作为主键。因此，我推荐是新设一个字段专门用为主键，此主键本身在业务逻辑上不体现，不具有实际意义。而这种主键在一定程序增加了复杂度，所以要
视实际系统的规模大小而定，对于小项目，以后扩展不会很大的话，也查允许用实际唯一的字段作主键的。</font>
</p>
<p><strong><font size="3">主键的选择</font></strong>
</p>
<p><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp; </font>我们现在在思考一下，应该采用什么来作表的主键比较合理，申明一下，主键的设计没有一个定论，各人有各人的方法，哪怕同一个，在不同的项目中，也会采用不同的主键设计原则。</font>
</p>
<p><strong><font size="3">第一：编号作主键</font></strong>
</p>
<p><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; </font>此方法就是采用实际业务中的唯一字段的&#8220;编号&#8221;作为主键设计，这在小型的项目中是推荐这样做的，因为这可以使项目比较简单化，但在使用中却可能带来一些麻烦，比如要进行&#8220;编号修改&#8221;时，可能要涉及到很多相关联的其他表，就象黎叔说的&#8220;后果很严重&#8221;<font face="Times New Roman">;</font>还有就是上面提到的&#8220;业务要求允许编号重复时&#8221;，我们再那么先知，都无法知道业务将会修改成什么<font face="Times New Roman">?</font></font>
</p>
<p><strong><font size="3">第二：自动编号主键</font></strong>
</p>
<p><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>这种方法也是很多朋友在使用的，就是新建一个<font face="Times New Roman">ID</font>字段，自动增长，非常方便也满足主键的原则，优点是：数据库自动编号，速度快，而且是增量增长，聚集型主键按顺序存放，对于检索非常有利<font face="Times New Roman">;</font>数字型的，占用空间小，易排序，在程序中传递也方便<font face="Times New Roman">;</font>如果通过非系统增加记录（比如手动录入，或是用其他工具直接在表里插入新记录，或老系统数据导入）时，非常方便，不用担心主键重复问题。</font>
</p>
<p><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>缺点：其实缺点也就是来自其优点，就是因为自动增长，在手动要插入指定<font face="Times New Roman">ID</font>的记录时会显得麻烦，尤其是当系统与其他系统集成时，需要数据导入时，很难保证原系统的<font face="Times New Roman">ID</font>不发生主键冲突（前提是老系统也是数字型的）<font face="Times New Roman">;</font>如果其他系统主键不是数字型那就麻烦更大了，会导致修改主键数据类型了，这也会导致其他相关表的修改，后果同样很严重<font face="Times New Roman">;</font>就算其他系统也是数字型的，在导入时，为了区分新老数据，可能想在老数据主键前统一加一个&#8220;<font face="Times New Roman">o</font>&#8221;(old)来表示这是老数据，那么自动增长的数字型又面临一个挑战。</font>
</p>
<p><font size="3"><strong>第三：<font face="Times New Roman">Max</font></strong><strong>加一</strong></font>
</p>
<p><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; </font>由于自动编号存在那些问题，所以有些朋友就采用自己生成，同样是数字型的，只是把自动增长去掉了，采用在<font face="Times New Roman">Insert</font>时，读取<font face="Times New Roman">Max</font>值后加一，这种方法可以避免自动编号的问题，但也存在一个效率问题，如果记录非常大的话，那么<font face="Times New Roman">Max()</font>也会影响效率的<font face="Times New Roman">;</font>更严重的是并发性问题，如果同时有两人读到相同的<font face="Times New Roman">Max</font>后，加一后插入的<font face="Times New Roman">ID</font>值会重复，这已经是有经验教训的了。</font>
</p>
<p><strong><font size="3">第四：自制加一</font></strong>
</p>
<p><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; </font>考虑<font face="Times New Roman">Max</font>加一的效率后，有人采用自制加一，也就是建一个特别的表，字段为：表名，当前序列值。这样在往表中插入值时，先从此表中找到相应表的最大值后加一，进行插入，有人可能发现，也可能会存在并发处理，这个并发处理，我们可以采用<font face="Times New Roman">lock</font>线程的方式来避免，在生成此值的时，先<font face="Times New Roman">Lock</font>，取到值以后，再<font face="Times New Roman">unLock</font>出来，这样不会有两人同时生成了。这比<font face="Times New Roman">Max</font>加一的速度要快多了。但同样存在一个问题：在与其他系统集成时，脱离了系统中的生成方法后，很麻烦保证自制表中的最大值与导入后的保持一致，而且数字型都存在上面讲到的&#8220;<font face="Times New Roman">o</font>&#8221;老数据的导入问题。因此在&#8220;自制加一&#8221;中可以把主键设为字符型的。字符型的自制加一我倒是蛮推荐的，应该字符型主键可以应付很多我们意想不到的情况。</font>
</p>
<p><font size="3"><strong>第五：<font face="Times New Roman">GUID</font></strong><strong>主键</strong></font>
</p>
<p><font size="3"><font face="Times New Roman">&nbsp;&nbsp;&nbsp; </font>目前一个比较好的主键是采用<font face="Times New Roman">GUID</font>，当然我是推荐主键还是字符型的，但值由<font face="Times New Roman">GUID</font>生成，<font face="Times New Roman">GUID</font>是可以自动生成，也可以程序生成，而且键值不可能重复，可以解决系统集成问题，几个系统的<font face="Times New Roman">GUID</font>值导到一起时，也不会发生重复，就算有&#8220;<font face="Times New Roman">o</font>&#8221;老数据也可以区分，而且效率很高，在<font face="Times New Roman">.NET</font>里可以直接使用<font face="Times New Roman">System.Guid.NewGuid()</font>进行生成，在<font face="Times New Roman">SQL</font>里也可以使用<font face="Times New Roman"> </font></font>NewID()<font size="3">生成。优点是：</font>
</p>
<p><font size="3">同<font face="Times New Roman"> IDENTITY </font>列相比，<font face="Times New Roman">uniqueidentifier </font>列可以通过<font face="Times New Roman"> NewID() </font>函数提前得知新增加的行<font face="Times New Roman"> ID</font>，为应用程序的后续处理提供了很大方便。</font>
</p>
<p><font size="3">便于数据库移植，其它数据库中并不一定具有<font face="Times New Roman"> IDENTITY </font>列，而<font face="Times New Roman"> Guid </font>列可以作为字符型列转换到其它数据库中，同时将应用程序中产生的<font face="Times New Roman"> GUID </font>值存入数据库，它不会对原有数据带来影响。</font>
</p>
<p><font size="3">便于数据库初始化，如果应用程序要加载一些初始数据，<font face="Times New Roman"> IDENTITY </font>列的处理方式就比较麻烦，而<font face="Times New Roman"> uniqueidentifier </font>列则无需任何处理，直接用<font face="Times New Roman"> T-SQL </font>加载即可。</font>
</p>
<p><font size="3">便于对某些对象或常量进行永久标识，如类的<font face="Times New Roman"> ClassID</font>，对象的实例标识，<font face="Times New Roman">UDDI </font>中的联系人、服务接口、<font face="Times New Roman">tModel</font>标识定义等。</font>
</p>
<p><font size="3">缺点是：</font>
</p>
<p><font size="3"><font face="Times New Roman">GUID </font>值较长，不容易记忆和输入，而且这个值是随机、无顺序的</font>
</p>
<p><font size="3"><font face="Times New Roman">GUID </font>的值有<font face="Times New Roman"> 16 </font>个字节，与其它那些诸如<font face="Times New Roman"> 4 </font>字节的整数相比要相对大一些。这意味着如果在数据库中使用<font face="Times New Roman"> uniqueidentifier </font>键，可能会带来两方面的消极影响：存储空间增大；索引时间较慢。</font>
</p>
<p><font face="Times new roman" size="3">&nbsp;</font>
</p>
<p><font size="3">我也不是推荐<font face="Times New Roman">GUID</font>最好，其实在不同的情况，我们都可以采用上面的某一种方式，思考了一些利与弊，也方便大家在进行设计时参考。这些也只是我的一点思考而已，而且可能我知识面限制，会有一些误论在里面，希望大家有什么想法欢迎讨论。</font>
</p>
&nbsp;
原文：<a  href="http://www.cnblogs.com/tintown/archive/2005/03/02/111459.html">http://www.cnblogs.com/tintown/archive/2005/03/02/111459.html</a><br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-07-29 13:50 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/07/29/5494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[MySQL] 主键和外键的设计原则</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/07/29/5493.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Tue, 29 Jul 2008 05:49:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/07/29/5493.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5493.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/07/29/5493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5493.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5493.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。<br><br>必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境，就很难对这些键进行修改，所以在开发阶段就设计好主键和外键就是非常必要和值得的。<br><br>首先来谈：主键。<br><br>关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途：<br>1.&nbsp;惟一地标识一行。<br>2.&nbsp;作为一个可以被外键有效引用的对象。<br><br>基于以上这两个用途，下面给出了我在设计物理层面的主键时所遵循的一些原则：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据，并抱怨它没有什么用处，那就证明它的主键设计地很好。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;主键应该是单列的，以便提高连接和筛选操作的效率。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注：使用复合键的人通常有两个理由为自己开脱，而这两个理由都是错误的。其一是主键应当具有实际意义，然而，让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键，我也反对这种做法，理由是：复合主键常常导致不良的外键，即当连接表成为另一个从表的主表，而依据上面的第二种方法成为这个表主键的一部分，然，这个表又有可能再成为其它从表的主表，其主键又有可能成了其它从表主键的一部分，如此传递下去，越靠后的从表，其主键将会包含越多的列了。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;永远也不要更新主键。实际上，因为主键除了惟一地标识一行之外，再没有其他的用途了，所以也就没有理由去对它更新。如果主键需要更新，则说明主键应对用户无意义的原则被违反了。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注：这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;主键不应包含动态变化的数据，如时间戳、创建时间列、修改时间列等。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.&nbsp;主键应当有计算机自动生成。如果由人来对主键的创建进行干预，就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限，就可能产生认为修改主键的动机，这样，这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。</span></div>
<br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-07-29 13:49 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/07/29/5493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL索引分析和优化 （笔记）</title><link>http://www.phpweblog.net/fuyongjie/archive/2008/07/19/5376.html</link><dc:creator>bestmost</dc:creator><author>bestmost</author><pubDate>Fri, 18 Jul 2008 17:04:00 GMT</pubDate><guid>http://www.phpweblog.net/fuyongjie/archive/2008/07/19/5376.html</guid><wfw:comment>http://www.phpweblog.net/fuyongjie/comments/5376.html</wfw:comment><comments>http://www.phpweblog.net/fuyongjie/archive/2008/07/19/5376.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.phpweblog.net/fuyongjie/comments/commentRss/5376.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/fuyongjie/services/trackbacks/5376.html</trackback:ping><description><![CDATA[1.<span class="style1">MySQL能够在name的<span style="color: red;">索引</span>中查找&#8220;Mike&#8221;值，然后直接转到<span style="color: red;">数据</span>文件中相应的行，准确地返回该行的
peopleid（999）。在这个过程中，MySQL只需处理一个行就可以返回结果。如果没有&#8220;name&#8221;列的索引，MySQL要扫描数据文件中的所有
记录，即1000个记录！显然，需要MySQL处理的记录数量越少，则它完成任务的速度就越快。</span><br><br>2.<span class="style1"><span style="color: red;">当我们执行查询的时候，MySQL只能使用一个索引</span>。如果你有三个单列的索引，MySQL会试图选择一个限制最严格的索引。但是，即使是限制最严格的单列索引，它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。<br><br>3.</span>多列索引还有另外一个优点，它通过称为最左前缀（Leftmost
Prefixing）的概念体现出来。继续考虑前面的例子，现在我们<span style="color: red;">有一个firstname、lastname、age列上的多列索引</span>，我们称这个索引
为fname_lname_age。当<span style="color: red;">搜索条件是以下各种列的组合时，MySQL将使用fname_lname_age索引：</span> <br><br><ccid_nobr>
</ccid_nobr>
<table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="550">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code><span style="color: red;">firstname，lastname，age</span><br><span style="color: red;">firstname，lastname</span><br style="color: red;"><span style="color: red;">firstname</span></ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>从另一方面理解，它相当于我们创建了(firstname，lastname，age)、(firstname，lastname)以及(firstname)这些列组合上的索引。下面这些查询都能够使用这个fname_lname_age索引： <br><span class="style1"><br><ccid_nobr>
</ccid_nobr>
<table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="550">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND <br>age='17'; SELECT peopleid FROM people WHERE firstname='Mike' AND <br>lastname='Sullivan'; SELECT peopleid FROM people WHERE firstname='Mike'; The <br>following queries cannot use the index at all: SELECT peopleid FROM people WHERE <br>lastname='Sullivan'; SELECT peopleid FROM people WHERE age='17'; SELECT peopleid <br>FROM people WHERE lastname='Sullivan' AND age='17';</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
<br></span><br>4.<span class="style1">在性能优化过程中，选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列：<span style="color: red;">在WHERE子句中出现的列</span>，在<span style="color: red;">join子句</span>中出现的列。<br><br>5.</span><span class="style1">我们是否可以简单地认为应该索引WHERE子句和join子句中出现的每一个列呢？差不多如此，但并不完全。
我们还必须考虑到对列进行比较的操作符类型。<span style="color: #ff0000;">MySQL只有对以下操作符才使用索引：&lt;，&lt;=，=，&gt;，&gt;=，BETWEEN，
IN，以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符（%或者_）开头的情形</span>。例如，&#8220;SELECT
peopleid FROM people WHERE firstname LIKE '<span style="color: #2708ff;">Mich%';&#8221;这个查询将使用索引</span>，<span style="color: red;">但&#8220;SELECT
peopleid FROM people WHERE firstname LIKE '<span style="color: #2708ff;">%ike</span>';&#8221;这个查询不会使用索引。 <br><br>6.</span></span><span class="style1">对于需要写入数据的操作，比如DELETE、UPDATE以及INSERT操作，索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件，而且它还要把这些改动写入索引文件。</span><br><br><br><img src ="http://www.phpweblog.net/fuyongjie/aggbug/5376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/fuyongjie/" target="_blank">bestmost</a> 2008-07-19 01:04 <a href="http://www.phpweblog.net/fuyongjie/archive/2008/07/19/5376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>