﻿<?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>IT博客网-阿里技术学习博客</title><link>http://www.cnitblog.com/aliyiyi08/</link><description>分享学习经验</description><language>zh-cn</language><lastBuildDate>Thu, 08 Jan 2009 18:50:02 GMT</lastBuildDate><pubDate>Thu, 08 Jan 2009 18:50:02 GMT</pubDate><ttl>60</ttl><item><title>使用php监听标准输入的方式,实现实时调用的方式</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/12/03/52173.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Wed, 03 Dec 2008 08:22:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/12/03/52173.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/52173.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/12/03/52173.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/52173.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/52173.html</trackback:ping><description><![CDATA[<p class=MsoNormal><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p>&nbsp;</o:p></span></font></p>
<p class=MsoNormal><font face=Arial color=#800080 size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><a title=http://cn.php.net/proc_open href="http://cn.php.net/proc_open"><u>http://cn.php.net/proc_open</u></a></span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">的以下这一段就是原来我也在玩的一个想法</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">!</span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">很有意思</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">!<o:p></o:p></span></font></p>
<p class=MsoNormal><font face=宋体 color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">启动一堆</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">php</span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">子进程</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">这些子进程全在监听标准输入</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">,</span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">主进程有任务时再把数据扔给子进程</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">!</span></font><font color=navy size=1><span style="FONT-SIZE: 9pt; COLOR: navy">这样应该比每次都生成一堆子进程来得节省资源</span></font><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">!<o:p></o:p></span></font></p>
<p class=MsoNormal><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p>&nbsp;</o:p></span></font></p>
<p class=MsoNormal><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p>&nbsp;</o:p></span></font></p>
<p class=MsoNormal><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p>&nbsp;</o:p></span></font></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0"><strong><strong><font face=Verdana color=black size=2><span lang=EN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana">jaroslaw at pobox dot sk</span></font></strong></strong><font face=Verdana color=black size=2><span lang=EN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana"><br><a title=http://cn.php.net/manual/en/function.proc-open.php#82130#82130 href="http://cn.php.net/manual/en/function.proc-open.php#82130#82130"><u><font color=#0000ff>28-Mar-2008 06:15</font></u></a> <o:p></o:p></span></font></p>
<p class=MsoNormal style="BACKGROUND: #f0f0f0"><span class=html1><font face="Courier New" color=black size=3><span lang=EN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Courier New'">Some functions stops working proc_open() to me.</span></font></span><font face="Courier New" color=black><span lang=EN style="COLOR: black; FONT-FAMILY: 'Courier New'"><br><span class=html1><font color=black>This i made to work for me to communicate between two php scripts:</font></span><br><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">&lt;?php</span></font></span><font face="Courier New" color=#0000bb><span lang=EN style="COLOR: #0000bb; FONT-FAMILY: 'Courier New'"><br><span class=default1><font color=#0000bb>$abs_path </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'/var/www/domain/filename.php'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">;</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$spec </span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= array(array(</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"pipe"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"r"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">), array(</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"pipe"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"w"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">), array(</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"pipe"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">"w"</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">)); </span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$process </span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">proc_open</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'php '</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">.</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$abs_path</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$spec</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">null</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">, </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$_ENV</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">); </span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>if (</font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">is_resource</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$process</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">)) {</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># wait till something happens on other side</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">sleep</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># send command</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fwrite</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">0</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">], </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'echo $test;'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fflush</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">0</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">]);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># wait till something happens on other side</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">usleep</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1000</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># read pipe for result</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">echo </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fread</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">],</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1024</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">).</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'&lt;hr&gt;'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">;</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># close pipes</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fclose</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">0</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">]);</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fclose</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">]);</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fclose</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$pipes</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">[</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">2</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">]);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$return_value </span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">proc_close</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$process</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>}</font></span><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">?&gt;</span></font></span><font face="Courier New" color=#0000bb><span lang=EN style="COLOR: #0000bb; FONT-FAMILY: 'Courier New'"><br></span></font><font face="Courier New" color=black><span lang=EN style="COLOR: black; FONT-FAMILY: 'Courier New'"><br><span class=html1><font color=black>filename.php then contains this:</font></span><br><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">&lt;?php</span></font></span><font face="Courier New" color=#0000bb><span lang=EN style="COLOR: #0000bb; FONT-FAMILY: 'Courier New'"><br><span class=default1><font color=#0000bb>$test </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'test data generated here&lt;br&gt;'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">;</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>while(</font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">true</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">) {</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># read incoming command</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">if(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$fh </span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fopen</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'php://stdin'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">,</span></font></span><span class=string1><font face="Courier New" color=#dd0000><span lang=EN style="FONT-FAMILY: 'Courier New'">'rb'</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">)) {</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$val_in </span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">= </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fread</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$fh</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">,</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1024</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">fclose</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$fh</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; }</font></span><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># execute incoming command</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">if(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$val_in</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">)</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; eval(</font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$val_in</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">usleep</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">1000</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">);</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=comment1><font face="Courier New" color=#ff8000><span lang=EN style="FONT-FAMILY: 'Courier New'"># prevent neverending cycle</span></font></span><font face="Courier New" color=#ff8000><span lang=EN style="COLOR: #ff8000; FONT-FAMILY: 'Courier New'"><br><span class=comment1><font color=#ff8000>&nbsp;&nbsp;&nbsp; </font></span></span></font><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">if(</span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">$tmp_counter</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">++ &gt; </span></font></span><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">100</span></font></span><span class=keyword1><font face="Courier New" color=#007700><span lang=EN style="FONT-FAMILY: 'Courier New'">)</span></font></span><font face="Courier New" color=#007700><span lang=EN style="COLOR: #007700; FONT-FAMILY: 'Courier New'"><br><span class=keyword1><font color=#007700>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; break;</font></span><br><span class=keyword1><font color=#007700>}</font></span><br></span></font><span class=default1><font face="Courier New" color=#0000bb><span lang=EN style="FONT-FAMILY: 'Courier New'">?&gt;</span></font></span><span class=html1><font face="Courier New" color=black><span lang=EN style="FONT-FAMILY: 'Courier New'"> </span></font></span><font face=Verdana color=black size=2><span lang=EN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana"><o:p></o:p></span></font></p>
<p class=MsoNormal><font face=Arial color=navy size=1><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial"><o:p>&nbsp;</o:p></span></font></p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/52173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-12-03 16:22 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/12/03/52173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>记录一下两个php5实现多任务处理的方式</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/11/21/51763.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Fri, 21 Nov 2008 04:09:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/11/21/51763.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/51763.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/11/21/51763.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/51763.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/51763.html</trackback:ping><description><![CDATA[<p>记录一下两个php5实现多任务处理的方式:<br>一、针对proc_open打开管道的方式<br>&lt;?php</p>
<p>echo "Programstartsat".date('h:i:s').".\n";</p>
<p>$timeout=10;</p>
<p>$streams=array();</p>
<p>$handles=array();</p>
<p>/*Firstlaunchaprogramwithadelayofthreeseconds,then</p>
<p>onewhichreturnsafteronlyonesecond.*/</p>
<p>$delay=30;</p>
<p>for($id=0;$id&lt;=10;$id++){</p>
<p>&nbsp;$error_log="".$id.".txt";</p>
<p>&nbsp;$descriptorspec=array(</p>
<p>&nbsp;&nbsp;0=&gt;array("pipe","r"),</p>
<p>&nbsp;&nbsp;1=&gt;array("pipe","w"),</p>
<p>&nbsp;&nbsp;2=&gt;array("file",$error_log,"w")</p>
<p>&nbsp;);</p>
<p>&nbsp;$cmd='sleep '.$delay.';echo "Finishedwithdelayof'.$delay.'".';<br>echo $cmd."--\n";</p>
<p><br>&nbsp;</p>
<p>&nbsp;$handles[$id]=proc_open($cmd,$descriptorspec,$pipes);</p>
<p>&nbsp;$streams[$id]=$pipes[1];</p>
<p>&nbsp;$all_pipes[$id]=$pipes;</p>
<p>&nbsp;$delay-=2;</p>
<p>}</p>
<p>while(count($streams)){</p>
<p>echo "while------\n";<br>&nbsp;$read=$streams;</p>
<p>&nbsp;stream_select($read,$w=null,$e=null,$timeout);</p>
<p>&nbsp;foreach($read as $r){</p>
<p>&nbsp;&nbsp;$id=array_search($r,$streams);</p>
<p>&nbsp;&nbsp;echo stream_get_contents($all_pipes[$id][1]) . "-\n";</p>
<p>&nbsp;&nbsp;if(feof($r)){</p>
<p>&nbsp;&nbsp;&nbsp;fclose($all_pipes[$id][0]);</p>
<p>&nbsp;&nbsp;&nbsp;fclose($all_pipes[$id][1]);</p>
<p>&nbsp;&nbsp;&nbsp;$return_value=proc_close($handles[$id]);<br>echo "--".$return_value."\n";</p>
<p>&nbsp;&nbsp;&nbsp;unset($streams[$id]);</p>
<p>&nbsp;&nbsp;}</p>
<p>&nbsp;}</p>
<p>}</p>
<p>?&gt;</p>
<p><br><br>二、针对stream_socket_client打开socket的方式<br><br>清单1.同时请求多个HTTP页面</p>
<p>＜?php</p>
<p>echo"Programstartsat".date(''h:i:s'').".\n";</p>
<p>$timeout=10;</p>
<p>$result=array();</p>
<p>$sockets=array();</p>
<p>$convenient_read_block=8192;</p>
<p>/*Issueallrequestssimultaneously;there''snoblocking.*/</p>
<p>$delay=15;</p>
<p>$id=0;</p>
<p>while($delay＞0){</p>
<p>$s=stream_socket_client("phaseit.net:80",$errno,</p>
<p>$errstr,$timeout,</p>
<p>STREAM_CLIENT_ASYNC_CONNECT&#124;STREAM_CLIENT_CONNECT);</p>
<p>if($s){</p>
<p>$sockets[$id++]=$s;</p>
<p>$http_message="GET/demonstration/delay?delay=".</p>
<p>$delay."HTTP/1.0\r\nHost:phaseit.net\r\n\r\n";</p>
<p>fwrite($s,$http_message);</p>
<p>}else{</p>
<p>echo"Stream".$id."failedtoopencorrectly.";</p>
<p>}</p>
<p>$delay-=3;</p>
<p>}</p>
<p>while(count($sockets)){</p>
<p>$read=$sockets;</p>
<p>stream_select($read,$w=null,$e=null,$timeout);</p>
<p>if(count($read)){</p>
<p>/*stream_selectgenerallyshuffles$read,soweneedto</p>
<p>computefromwhichsocket(s)we''rereading.*/</p>
<p>foreach($readas$r){</p>
<p>$id=array_search($r,$sockets);</p>
<p>$data=fread($r,$convenient_read_block);</p>
<p>/*Asocketisreadableeitherbecauseithas</p>
<p>datatoread,ORbecauseit''satEOF.*/</p>
<p>if(strlen($data)==0){</p>
<p>echo"Stream".$id."closesat".date(''h:i:s'').".\n";</p>
<p>fclose($r);</p>
<p>unset($sockets[$id]);</p>
<p>}else{</p>
<p>$result[$id].=$data;</p>
<p>}</p>
<p>}</p>
<p>}else{</p>
<p>/*Atime-outmeansthat*all*streamshavefailed</p>
<p>toreceivearesponse.*/</p>
<p>echo"Time-out!\n";</p>
<p>break;</p>
<p>}</p>
<p>}</p>
<p>?＞</p>
<p>如果运行此清单，您将看到如下所示的输出。</p>
<p>清单2.从清单1中的程序获得的典型输出</p>
<p>Programstartsat02:38:50.</p>
<p>Stream4closesat02:38:53.</p>
<p>Stream3closesat02:38:56.</p>
<p>Stream2closesat02:38:59.</p>
<p>Stream1closesat02:39:02.</p>
<p>Stream0closesat02:39:05.<br><br></p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/51763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-11-21 12:09 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/11/21/51763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP5新特性: 更加面向对象化的PHP[收藏]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/10/14/50157.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Mon, 13 Oct 2008 17:03:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/10/14/50157.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/50157.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/10/14/50157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/50157.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/50157.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: PHP处理对象部分的内核完全重新开发过，提供更多功能的同时也提高了性能。在以前版本的php中，处理对象和处理基本类型（数字，字符串）的方式是一样的。这种方式的缺陷是：当将对象赋值给一个变量时，或者通过参数传递对象时，对象将被完全拷贝一份。在新的版本里，上述操作将传递引用（可以把引用理解成对象的标识符），而非值。<br><br>很多PHP程序员可能甚至没有察觉到老的对象处理方式。事实上，大多数的php应用都可以很好地运行。或者仅仅需要很少的改动。<br><br>私有和受保护成员<br>PHP5引入了私有和受保护成员变量的概念。我们可以用它来定义类成员的可见性。<br>&nbsp;&nbsp;<a href='http://www.cnitblog.com/aliyiyi08/archive/2008/10/14/50157.html'>阅读全文</a><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/50157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-10-14 01:03 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/10/14/50157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql Explain 详解[强烈推荐]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Tue, 09 Sep 2008 05:15:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/48878.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/48878.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/48878.html</trackback:ping><description><![CDATA[Mysql Explain 详解<br><br><br>一.语法<br><br>explain &lt; table_name &gt;<br><br>例如: explain select * from t3 where id=3952602;<br><br>二.explain输出解释<br><br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+<br>| id | select_type | table | type&nbsp;&nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp; &nbsp;| rows | Extra |<br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+<br><br>1.id<br>&nbsp;&nbsp;我的理解是SQL执行的顺利的标识,SQL从大到小的执行.<br><br>例如:<br>mysql&gt; explain select * from (select * from ( select * from t3 where id=3952602) a) b;<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br>| id | select_type | table&nbsp; &nbsp;&nbsp; &nbsp;| type&nbsp; &nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp;&nbsp;| rows | Extra |<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br>|&nbsp;&nbsp;1 | PRIMARY&nbsp; &nbsp;&nbsp;&nbsp;| &lt;derived2&gt; | system | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;2 | DERIVED&nbsp; &nbsp;&nbsp;&nbsp;| &lt;derived3&gt; | system | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;3 | DERIVED&nbsp; &nbsp;&nbsp;&nbsp;| t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| const&nbsp;&nbsp;| PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; |&nbsp; &nbsp;&nbsp; &nbsp;|&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br><br>很显然这条SQL是从里向外的执行,就是从id=3 向上执行.<br><br>2. select_type<br><br>就是select类型,可以有以下几种<br><br>(1) SIMPLE<br>简单SELECT(不使用UNION或子查询等) 例如:<br>mysql&gt; explain select * from t3 where id=3952602;<br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+<br>| id | select_type | table | type&nbsp;&nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp; &nbsp;| rows | Extra |<br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+<br>|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| t3&nbsp; &nbsp; | const | PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; | const |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+<br><br>(2). PRIMARY<br><br>我的理解是最外层的select.例如:<br><br>mysql&gt; explain select * from (select * from t3 where id=3952602) a ;<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br>| id | select_type | table&nbsp; &nbsp;&nbsp; &nbsp;| type&nbsp; &nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp;&nbsp;| rows | Extra |<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br>|&nbsp;&nbsp;1 | PRIMARY&nbsp; &nbsp;&nbsp;&nbsp;| &lt;derived2&gt; | system | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;2 | DERIVED&nbsp; &nbsp;&nbsp;&nbsp;| t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| const&nbsp;&nbsp;| PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; |&nbsp; &nbsp;&nbsp; &nbsp;|&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br><br>(3).UNION<br><br>UNION中的第二个或后面的SELECT语句.例如<br>mysql&gt; explain select * from t3 where id=3952602 union all select * from t3 ;<br>+----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+<br>| id | select_type&nbsp;&nbsp;| table&nbsp; &nbsp;&nbsp; &nbsp;| type&nbsp;&nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp; &nbsp;| rows | Extra |<br>+----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+<br>|&nbsp;&nbsp;1 | PRIMARY&nbsp; &nbsp;&nbsp; &nbsp;| t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| const | PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; | const |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;2 | UNION&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| ALL&nbsp; &nbsp;| NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL&nbsp;&nbsp;| 1000 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|NULL | UNION RESULT | &lt;union1,2&gt; | ALL&nbsp; &nbsp;| NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL&nbsp;&nbsp;| NULL |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+<br><br>(4).DEPENDENT UNION<br><br>UNION中的第二个或后面的SELECT语句，取决于外面的查询<br><br>mysql&gt; explain select * from t3 where id in (select id from t3 where id=3952602 union all select id from t3)&nbsp;&nbsp;;<br>+----+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+<br>| id | select_type&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| table&nbsp; &nbsp;&nbsp; &nbsp;| type&nbsp; &nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp; &nbsp;| rows | Extra&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>+----+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+<br>|&nbsp;&nbsp;1 | PRIMARY&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| ALL&nbsp; &nbsp; | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL&nbsp;&nbsp;| 1000 | Using where&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>|&nbsp;&nbsp;2 | DEPENDENT SUBQUERY | t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| const&nbsp;&nbsp;| PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; | const |&nbsp; &nbsp; 1 | Using index&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>|&nbsp;&nbsp;3 | DEPENDENT UNION&nbsp; &nbsp; | t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| eq_ref | PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; | func&nbsp;&nbsp;|&nbsp; &nbsp; 1 | Using where; Using index |<br>|NULL | UNION RESULT&nbsp; &nbsp;&nbsp; &nbsp; | &lt;union2,3&gt; | ALL&nbsp; &nbsp; | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL&nbsp;&nbsp;| NULL |&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>+----+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+<br><br>(4).UNION RESULT<br><br>UNION的结果。<br><br>mysql&gt; explain select * from t3 where id=3952602 union all select * from t3 ;<br>+----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+<br>| id | select_type&nbsp;&nbsp;| table&nbsp; &nbsp;&nbsp; &nbsp;| type&nbsp;&nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp; &nbsp;| rows | Extra |<br>+----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+<br>|&nbsp;&nbsp;1 | PRIMARY&nbsp; &nbsp;&nbsp; &nbsp;| t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| const | PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; | const |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;2 | UNION&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| ALL&nbsp; &nbsp;| NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL&nbsp;&nbsp;| 1000 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|NULL | UNION RESULT | &lt;union1,2&gt; | ALL&nbsp; &nbsp;| NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL&nbsp;&nbsp;| NULL |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+<br><br>(5).SUBQUERY<br><br>子查询中的第一个SELECT.<br><br>mysql&gt; explain select * from t3 where id = (select id from t3 where id=3952602 )&nbsp;&nbsp;;<br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------------+<br>| id | select_type | table | type&nbsp;&nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp; &nbsp;| rows | Extra&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------------+<br>|&nbsp;&nbsp;1 | PRIMARY&nbsp; &nbsp;&nbsp;&nbsp;| t3&nbsp; &nbsp; | const | PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; | const |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;2 | SUBQUERY&nbsp; &nbsp; | t3&nbsp; &nbsp; | const | PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; |&nbsp; &nbsp;&nbsp; &nbsp; |&nbsp; &nbsp; 1 | Using index |<br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------------+<br><br>(6).&nbsp;&nbsp;DEPENDENT SUBQUERY<br><br>子查询中的第一个SELECT，取决于外面的查询<br><br>mysql&gt; explain select id from t3 where id in (select id from t3 where id=3952602 )&nbsp;&nbsp;;<br>+----+--------------------+-------+-------+-------------------+---------+---------+-------+------+--------------------------+<br>| id | select_type&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| table | type&nbsp;&nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp; &nbsp;| rows | Extra&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>+----+--------------------+-------+-------+-------------------+---------+---------+-------+------+--------------------------+<br>|&nbsp;&nbsp;1 | PRIMARY&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| t3&nbsp; &nbsp; | index | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; | NULL&nbsp;&nbsp;| 1000 | Using where; Using index |<br>|&nbsp;&nbsp;2 | DEPENDENT SUBQUERY | t3&nbsp; &nbsp; | const | PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; | const |&nbsp; &nbsp; 1 | Using index&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>+----+--------------------+-------+-------+-------------------+---------+---------+-------+------+--------------------------+<br><br><br>(7).DERIVED<br><br>派生表的SELECT(FROM子句的子查询)<br><br>mysql&gt; explain select * from (select * from t3 where id=3952602) a ;<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br>| id | select_type | table&nbsp; &nbsp;&nbsp; &nbsp;| type&nbsp; &nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp;&nbsp;| rows | Extra |<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br>|&nbsp;&nbsp;1 | PRIMARY&nbsp; &nbsp;&nbsp;&nbsp;| &lt;derived2&gt; | system | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;2 | DERIVED&nbsp; &nbsp;&nbsp;&nbsp;| t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| const&nbsp;&nbsp;| PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; |&nbsp; &nbsp;&nbsp; &nbsp;|&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br><br><br>3.table<br><br>显示这一行的数据是关于哪张表的.<br>有时不是真实的表名字,看到的是derivedx(x是个数字,我的理解是第几步执行的结果)<br><br>mysql&gt; explain select * from (select * from ( select * from t3 where id=3952602) a) b;<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br>| id | select_type | table&nbsp; &nbsp;&nbsp; &nbsp;| type&nbsp; &nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp;&nbsp;| rows | Extra |<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br>|&nbsp;&nbsp;1 | PRIMARY&nbsp; &nbsp;&nbsp;&nbsp;| &lt;derived2&gt; | system | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;2 | DERIVED&nbsp; &nbsp;&nbsp;&nbsp;| &lt;derived3&gt; | system | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;3 | DERIVED&nbsp; &nbsp;&nbsp;&nbsp;| t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| const&nbsp;&nbsp;| PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; |&nbsp; &nbsp;&nbsp; &nbsp;|&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br><br>4.type<br><br>这列很重要,显示了连接使用了哪种类别,有无使用索引.<br>从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL <br><br>(1).system<br><br>这是const联接类型的一个特例。表仅有一行满足条件.如下(t3表上的id是 primary key)<br><br>mysql&gt; explain select * from (select * from t3 where id=3952602) a ;<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br>| id | select_type | table&nbsp; &nbsp;&nbsp; &nbsp;| type&nbsp; &nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp;&nbsp;| rows | Extra |<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br>|&nbsp;&nbsp;1 | PRIMARY&nbsp; &nbsp;&nbsp;&nbsp;| &lt;derived2&gt; | system | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp; | NULL |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;2 | DERIVED&nbsp; &nbsp;&nbsp;&nbsp;| t3&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| const&nbsp;&nbsp;| PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; |&nbsp; &nbsp;&nbsp; &nbsp;|&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+<br><br>(2).const<br><br>表最多有一个匹配行，它将在查询开始时被读取。因为仅有一行，在这行的列值可被优化器剩余部分认为是常数。const表很快，因为它们只读取一次！<br><br>const用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时。在下面的查询中，tbl_name可以用于const表：<br>SELECT * from tbl_name WHERE primary_key=1；<br>SELECT * from tbl_name WHERE primary_key_part1=1和 primary_key_part2=2；<br><br>例如:<br>mysql&gt; explain select * from t3 where id=3952602;<br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+<br>| id | select_type | table | type&nbsp;&nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp;&nbsp;| key_len | ref&nbsp; &nbsp;| rows | Extra |<br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+<br>|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| t3&nbsp; &nbsp; | const | PRIMARY,idx_t3_id | PRIMARY | 4&nbsp; &nbsp;&nbsp; &nbsp; | const |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+<br><br><br>(3). eq_ref<br><br>对于每个来自于前面的表的行组合，从该表中读取一行。这可能是最好的联接类型，除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。<br><br>eq_ref可以用于使用= 操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。<br><br>在下面的例子中，MySQL可以使用eq_ref联接来处理ref_tables：<br><br>SELECT * FROM ref_table,other_table<br>&nbsp;&nbsp;WHERE ref_table.key_column=other_table.column;<br><br>SELECT * FROM ref_table,other_table<br>&nbsp;&nbsp;WHERE ref_table.key_column_part1=other_table.column<br>&nbsp; &nbsp; AND ref_table.key_column_part2=1;<br><br>例如<br>mysql&gt; create unique index&nbsp;&nbsp;idx_t3_id on t3(id) ;<br>Query OK, 1000 rows affected (0.03 sec)<br>Records: 1000&nbsp;&nbsp;Duplicates: 0&nbsp;&nbsp;Warnings: 0<br><br>mysql&gt; explain select * from t3,t4 where t3.id=t4.accountid;<br>+----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+<br>| id | select_type | table | type&nbsp; &nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp; &nbsp; | key_len | ref&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| rows | Extra |<br>+----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+<br>|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| t4&nbsp; &nbsp; | ALL&nbsp; &nbsp; | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp;&nbsp; &nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| 1000 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| t3&nbsp; &nbsp; | eq_ref | PRIMARY,idx_t3_id | idx_t3_id | 4&nbsp; &nbsp;&nbsp; &nbsp; | dbatest.t4.accountid |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+<br><br>(4).ref<br><br>对于每个来自于前面的表的行组合，所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀，或如果键不是UNIQUE或PRIMARY KEY（换句话说，如果联接不能基于关键字选择单个行的话），则使用ref。如果使用的键仅仅匹配少量行，该联接类型是不错的。<br><br>ref可以用于使用=或&lt;=&gt;操作符的带索引的列。<br><br>在下面的例子中，MySQL可以使用ref联接来处理ref_tables：<br><br>SELECT * FROM ref_table WHERE key_column=expr;<br><br>SELECT * FROM ref_table,other_table<br>&nbsp;&nbsp;WHERE ref_table.key_column=other_table.column;<br><br>SELECT * FROM ref_table,other_table<br>&nbsp;&nbsp;WHERE ref_table.key_column_part1=other_table.column<br>&nbsp; &nbsp; AND ref_table.key_column_part2=1;<br><br>例如:<br><br>mysql&gt; drop index idx_t3_id on t3;<br>Query OK, 1000 rows affected (0.03 sec)<br>Records: 1000&nbsp;&nbsp;Duplicates: 0&nbsp;&nbsp;Warnings: 0<br><br>mysql&gt; create index idx_t3_id on t3(id) ;<br>Query OK, 1000 rows affected (0.04 sec)<br>Records: 1000&nbsp;&nbsp;Duplicates: 0&nbsp;&nbsp;Warnings: 0<br><br>mysql&gt; explain select * from t3,t4 where t3.id=t4.accountid;<br>+----+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+<br>| id | select_type | table | type | possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp; &nbsp; | key_len | ref&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| rows | Extra |<br>+----+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+<br>|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| t4&nbsp; &nbsp; | ALL&nbsp;&nbsp;| NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| NULL&nbsp; &nbsp;&nbsp; &nbsp;| NULL&nbsp; &nbsp; | NULL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| 1000 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| t3&nbsp; &nbsp; | ref&nbsp;&nbsp;| PRIMARY,idx_t3_id | idx_t3_id | 4&nbsp; &nbsp;&nbsp; &nbsp; | dbatest.t4.accountid |&nbsp; &nbsp; 1 |&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+<br>2 rows in set (0.00 sec)<br><br>(5).&nbsp;&nbsp;ref_or_null<br><br>该联接类型如同ref，但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。<br><br>在下面的例子中，MySQL可以使用ref_or_null联接来处理ref_tables：<br><br>SELECT * FROM ref_table<br>WHERE key_column=expr OR key_column IS NULL;<br><br>(6). index_merge<br><br>该联接类型表示使用了索引合并优化方法。在这种情况下，key列包含了使用的索引的清单，key_len包含了使用的索引的最长的关键元素。<br><br>例如:<br>mysql&gt; explain select * from t4 where id=3952602 or accountid=31754306 ;<br>+----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+<br>| id | select_type | table | type&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| possible_keys&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| key_len | ref&nbsp;&nbsp;| rows | 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;|<br>+----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+<br>|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| t4&nbsp; &nbsp; | index_merge | idx_t4_id,idx_t4_accountid | idx_t4_id,idx_t4_accountid | 4,4&nbsp; &nbsp;&nbsp;&nbsp;| NULL |&nbsp; &nbsp; 2 | Using union(idx_t4_id,idx_t4_accountid); Using where |<br>+----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+<br>1 row in set (0.00 sec)<br><br>(7). unique_subquery<br><br>该类型替换了下面形式的IN子查询的ref：<br><br>value IN (SELECT primary_key FROM single_table WHERE some_expr)<br>unique_subquery是一个索引查找函数，可以完全替换子查询，效率更高。<br><br>(8).index_subquery<br><br>该联接类型类似于unique_subquery。可以替换IN子查询，但只适合下列形式的子查询中的非唯一索引：<br><br>value IN (SELECT key_column FROM single_table WHERE some_expr)<br><br>(9).range<br><br>只检索给定范围的行，使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。<br><br>当使用=、&lt;&gt;、&gt;、&gt;=、&lt;、&lt;=、IS NULL、&lt;=&gt;、BETWEEN或者IN操作符，用常量比较关键字列时，可以使用range<br><br>mysql&gt; explain select * from t3 where id=3952602 or id=3952603 ;<br>+----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+<br>| id | select_type | table | type&nbsp;&nbsp;| possible_keys&nbsp; &nbsp;&nbsp;&nbsp;| key&nbsp; &nbsp;&nbsp; &nbsp; | key_len | ref&nbsp;&nbsp;| rows | Extra&nbsp; &nbsp;&nbsp; &nbsp; |<br>+----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+<br>|&nbsp;&nbsp;1 | SIMPLE&nbsp; &nbsp;&nbsp; &nbsp;| t3&nbsp; &nbsp; | range | PRIMARY,idx_t3_id | idx_t3_id | 4&nbsp; &nbsp;&nbsp; &nbsp; | NULL |&nbsp; &nbsp; 2 | Using where |<br>+----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+<br>1 row in set (0.02 sec)<br><br>(10).index<br><br>该联接类型与ALL相同，除了只有索引树被扫描。这通常比ALL快，因为索引文件通常比数据文件小。<br><br>当查询只使用作为单索引一部分的列时，MySQL可以使用该联接类型。<br><br>(11). ALL<br><br>对于每个来自于先前的表的行组合，进行完整的表扫描。如果表是第一个没标记const的表，这通常不好，并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL，使得行能基于前面的表中的常数值或列值被检索出。<br><br><br>5.possible_keys<br><br>possible_keys列指出MySQL能使用哪个索引在该表中找到行。注意，该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。<br><br>如果该列是NULL，则没有相关的索引。在这种情况下，可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样，创造一个适当的索引并且再次用EXPLAIN检查查询<br><br>6. key<br><br>key列显示MySQL实际决定使用的键（索引）。如果没有选择索引，键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引，在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。<br><br>7.key_len<br><br>key_len列显示MySQL决定使用的键长度。如果键是NULL，则长度为NULL。<br>使用的索引的长度。在不损失精确性的情况下，长度越短越好 <br><br>8. ref<br><br>ref列显示使用哪个列或常数与key一起从表中选择行。<br><br>9. rows<br><br>rows列显示MySQL认为它执行查询时必须检查的行数。<br><br>10. Extra<br><br>该列包含MySQL解决查询的详细信息,下面详细.<br><br>(1).Distinct <br>一旦MYSQL找到了与行相联合匹配的行，就不再搜索了 <br><br>(2).Not exists <br>MYSQL优化了LEFT JOIN，一旦它找到了匹配LEFT JOIN标准的行， <br><br>就不再搜索了 <br><br>(3).Range checked for each <br><br>Record（index map:#） <br>没有找到理想的索引，因此对于从前面表中来的每一个行组合，MYSQL检查使用哪个索引，并用它来从表中返回行。这是使用索引的最慢的连接之一 <br><br>(4).Using filesort <br>看到这个的时候，查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行 <br><br>(5).Using index <br>列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的，这发生在对表的全部的请求列都是同一个索引的部分的时候 <br><br>(6).Using temporary <br>看到这个的时候，查询需要优化了。这里，MYSQL需要创建一个临时表来存储结果，这通常发生在对不同的列集进行ORDER BY上，而不是GROUP BY上 <br><br>(7).Using where<br>使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行，并且连接类型ALL或index，这就会发生，或者是查询有问题<br><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/48878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-09-09 13:15 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软没人比我更勤奋[唐骏]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/07/11/46611.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Fri, 11 Jul 2008 09:45:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/07/11/46611.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/46611.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/07/11/46611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/46611.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/46611.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em">校园里槐花香味弥漫，绿树成荫。门口一阵掌声打破了之前的嘈杂，唐骏微笑着从学生堆里挤出来。 </p>
<p style="TEXT-INDENT: 2em">他，曾历任微软中国总裁、盛大总裁，以年薪超过1亿元被媒体称为中国的&#8220;打工皇帝&#8221;。 </p>
<p style="TEXT-INDENT: 2em">&#8220;快点，不然就没位置了&#8221;一个站在厕所门口，不住的回头看报告厅的女生，朝着厕所门大声喊。&#8220;我没吃早餐就冲过来了，可是还是没位置。&#8221;一个男生愤愤地说。 </p>
<p style="TEXT-INDENT: 2em">唐骏走上演讲台，&#8220;我跟你们说一下我的个人密史，是我大学时代的初恋故事。&#8221;他神秘的说，台下一片掌声。 </p>
<p style="TEXT-INDENT: 2em">他这次是受管理学院院长包国宪教授之邀，做客&#8220;全球通&#8221;兰州大学管理学院学术论坛，讲述他职业规划的经历。 </p>
<p style="TEXT-INDENT: 2em">&#8220;在大学里，我很平凡、很普通，普通的让我感动，但我是有追求的。&#8221;他略带微笑的说。 </p>
<p style="TEXT-INDENT: 2em">本来是380多人的报告厅，现在有700多人，一千多双眼睛直射向唐骏。 </p>
<p style="TEXT-INDENT: 2em">三个门口人的密度最大，整个会堂呈三面包围状，前面的同学直接盘腿席地而坐。 </p>
<p style="TEXT-INDENT: 2em">唐骏1985年—1990年在日本名古屋大学自动化专业攻读硕士学位。&#8220;我考北京邮电大学研究生时是第一名，但没有得到出国留学的机会，&#8221;他冷静地说，&#8220;我就打电话问有没有剩余的名额，正好北京广播电视学院有一个，我就跑到教育司，李司长说：&#8216;同学，你回去吧。&#8217;&#8221; </p>
<p style="TEXT-INDENT: 2em">&#8220;我没有放弃，&#8221;他肯定的说。&#8220;每天早上7点，我就跑到教育司门口等李司长，一天、两天、三天，在第六天的时候李司长让我进他的办公室，填了一堆空白资料。&#8221; </p>
<p style="TEXT-INDENT: 2em">&#8220;我还想要在教育司一直呆到毕业为止，&#8221;他笑了笑，&#8220;我什么也没做，就是执着。&#8221; </p>
<p style="TEXT-INDENT: 2em">1994年，唐骏加入微软，微软当时有12000人，而他只是一个处于末尾的普通的软件工程师。 </p>
<p style="TEXT-INDENT: 2em">&#8220;在这些超人面前等待？放弃？不，我不放弃，不等待。&#8221;他决然的说。 </p>
<p style="TEXT-INDENT: 2em">现在英语、德语、日语、阿拉伯语等多语言引擎同时上市，再也不用先下载相应语言的Windows才能看网页了，方便了很多人。 </p>
<p style="TEXT-INDENT: 2em">&#8220;现在的大学生进入企业就开始抱怨，&#8221;他说，&#8220;我刚来微软的时候也发现微软有很多问题，但是我没有抱怨，而是利用晚上和周末的时间研究，最后才有多语言引擎的出现。&#8221; </p>
<p style="TEXT-INDENT: 2em">&#8220;我选择了别人没去做的事情。&#8221;他总结说, &#8220;在职业生涯中，要学会创造机遇，不是等待机遇。&#8221; </p>
<p style="TEXT-INDENT: 2em">&#8220;在任何时期、阶段，勤奋是可以弥补不足的，&#8221;他双手指挥似的说，&#8220;在微软没有人可以站出来说比唐骏更勤奋的。&#8221; </p>
<p style="TEXT-INDENT: 2em">2004年2月，唐骏由微软公司退休，同时被公司授予&#8220;名誉总裁&#8221;称号 </p>
<p style="TEXT-INDENT: 2em">&#8220;简单＋勤奋是我的座右铭，简单做人，勤奋做事。&#8221;他笑着说，&#8220;要先做人，再做事，偶尔做做秀，人生需要像企业一样经营。&#8221; </p>
<p style="TEXT-INDENT: 2em">白色条文衬衣，碎花领带，脸瘦的有点尖，明显的白色上眼皮的他在两个小时的演讲中，每隔两分钟就会有一次笑声或掌声，声音渐小后音响发出砰砰声。 </p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/46611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-07-11 17:45 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/07/11/46611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让IT人员提高薪酬的10种方法[转]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/07/11/46610.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Fri, 11 Jul 2008 09:34:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/07/11/46610.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/46610.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/07/11/46610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/46610.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/46610.html</trackback:ping><description><![CDATA[IT招聘专家和工作场所专家总结了技术专业人员应该掌握的一些具体技能。这些技能会帮助IT专业人员避免工作的低谷和得到薪酬上涨的好处。下面就是让IT人员提高薪酬的10种方法。
<p>　　1.熟悉SAAS产品</p>
<p>　　IT人员配备和随需应变的咨询公司Bluewolf的共同创始人和负责人Michael Kirven说，SAAS(软件服务)知识在用人要求条件中的比例已经从三年前的5%提高到了35%。拥有这方面知识的人可能很快提高自己的薪酬，无论他们是否知道alesforce、Google Apps或者WorkDay。每一个人都需要知道这些产品如何适合当前的IT架构。</p>
<p>　　2.获得SAP知识或者经验</p>
<p>　　位于费城的人才和外包服务公司Yoh Services复杂战略和营销的副总裁Jim Lanzalotto称，他支持拥有SAP技术的人，因为SAP技术顾问的需求量和现有人员之间的缺口有3至4万。</p>
<p>　　3.获得一个行业的垂直的技术专长</p>
<p>　　Kirven说，做一个Java程序员或者一个熟练的.Net开发人员就是一件很好的事情。但是，随着系统越来越复杂，企业不仅需要这些人学些这些编程语言，而且还要了解具体的垂直市场知识，如金融、零售或者媒体，并且了解所有这些知识。</p>
<p>　　4.获得一个虚拟化项目</p>
<p>　　IT job board Dice网站称，它看到招聘列表中对虚拟化知识人才的需求在过去的六个月里提高了40%，特别是需要了解VMware技术的人。</p>
<p>　　5.提高你的商务技能</p>
<p>　　Lanzalotto认为，商务经验对于提高IT专业人员的薪金水平是非常重要的。他说，最好的首席信息官不仅仅是一个技术人员，而且应该是能够在技术和业务两个方面都能够工作的业务人员。</p>
<p>　　6.获得开源软件产品开发经验</p>
<p>　　Kirven说，由于时代已经发生了变化，首席信息官采用MySQL和其它开源软件技术不会有失去工作的风险。事实上，业务人员经常会喜欢开源软件，因为它可能为公司省钱。</p>
<p>　　7.更近一步了解能够让你的公司赚钱的技术</p>
<p>　　在大型银行或者金融机构工作的人都知道你越接近能够让你的公司赚钱的技术，你的工作岗位对于你的公司就越重要。IT人员也是如此。参与让你的公司增加收入或者节省金钱的项目的IT人员很少会被人忽略。</p>
<p>　　8.首席信息官需要架构技能</p>
<p>　　Kirven称，IT架构是一个极好的职场道路，不仅因为这是一个高级的职位，而且还因为这些职位几乎完全是不会外包出去的。</p>
<p>　　9.付费参加项目管理认证学习的人</p>
<p>　　许多研究报名，虽然并非所有的证书都比印刷证书的成本值钱，但是，企业继续付出高价的费用聘用拥有关键证书的人才。其中最最主要的两个项目管理证书是PMP(项目管理专业人员)和PMO(项目管理办公室)。</p>
<p>　　10.跳槽</p>
<p>　　IT专业人员从一个地方搬迁的另一个地方的比例提高了20%。当你在你的技术专长领域寻求进一步发展时，换一个地理环境也许会有帮助。不同地区对于IT专业人员的技术需求是不同的。</p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/46610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-07-11 17:34 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/07/11/46610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>口碑营销的秘密[荐转]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/07/03/46261.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Thu, 03 Jul 2008 03:03:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/07/03/46261.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/46261.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/07/03/46261.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/46261.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/46261.html</trackback:ping><description><![CDATA[<p>宝洁旗下Tremor公司称他们用新方旧法调和，再配以大量秘制调料，揭开了口碑营销的秘密。&nbsp; </p>
<p>　　药剂师们从不指望偶然配成长生不死药，化学家们不会空耗时日炼铅成金，美国宇航局的科学家们也不会徒劳地修补时间机器。 </p>
<p>　　可是，宝洁公司倒是有一帮人耗费四年时光，要锤炼出营销魔法∶自然而然的口碑，也就是大家告诉大家。他们努力的硕果是打造了一支营销劲旅—Tremor公司，该公司声称已经揭开了口碑妙方的秘密。Tremor筛选出25万名青少年志愿者，构成庞大网络，先与同龄人接触最新的产品和理念。不用说，宝洁希望这些志愿者能够和周围的朋友们分享他们的新体验。这一招收效甚大，促使Tremor开始瞄准另一个目标市场—妈妈们—来施展逐渐成长起来的口碑营销。 </p>
<p>　　从这一举措背后可以窥见Tremor创造者的奇思妙想。想想这个名字就知道了∶颤栗（tremor）可能是一阵难以捉摸的情感或思绪，转瞬即逝。在Tremor网站的主页上，总是跳动着令参与者们激动的承诺。 </p>
<p>　　尽管这支劲旅采用的手段充满神秘色彩，宝洁仍然把它奉为营销科学∶旧法新用，通过以技术为后盾的研究加上创新方法来打造客户关系。这并不意味着宝洁愿意把魔法秘密公之于众，但是在接受《市场营销官》杂志采访时，Tremor的首席执行官史蒂夫&#183;诺克斯确实道出了宝洁研发及其成果的许多内幕。他还谈到了现在口碑营销上的知识缺口及其未来发展方向。 </p>
<p>　　&#8220;在Tremor成立的头几年，我们全力去了解口碑在市场上如何发挥作用，&#8221;诺克斯说。而且工作还不止于此。&#8220;口碑营销是一门动态科学而非静态科学。&#8221; </p>
<p>　　有些持怀疑态度的人说，口碑营销绝不可能是科学，硬把口碑同营销扯上关系太牵强。有些批评者认为，大肆夸大口碑营销的作用，妄想产生消费者自发宣传品牌的效果，只可能让营销人面对更大的挑战，因为公众会变得更多疑、更轻视广告宣传。但是宝洁这家全球最大的广告客户，不仅打造了一个口碑营销项目，而且专门成立了一个公司来推动口碑营销，其声势绝对能够淹没怀疑者们的声音。 </p>
<p>　　Tremor的客户数量快速增加。从2001年起，Tremor开始为母公司和其他公司的产品打造广告宣传活动。现在，Tremor为包括梦工厂在内的电影制作公司、可口可乐和丰田等品牌公司制作口碑营销计划。诺克斯说公司80%的品牌宣传活动中都是为其他公司制作的，但是他彬彬有礼地拒绝透露（或确认）任何客户的名称。 </p>
<p>　　除了宝洁以外，还有许多公司也在尝试把口碑营销由理想转变为真正可靠的分销渠道。口碑营销协会于2004年成立，拥有会员150 家。协会于3月份在芝加哥召开了第一次大会。随着Tremor和类似的口碑营销模式不断发展变化，许多大公司都开始密切关注这个新潮流了。 </p>
<p>　　Sprint通讯公司的消费者电子商务总监大卫&#183;迪克凯说∶&#8220;我们没有宝洁走得那么远。我们还不确定口碑营销会朝哪个方向发展。但是我们先要充分了解这个领域，如果它繁荣发展下去，我们就可以随时加以利用。&#8221;　　 </p>
<p>　　口碑营销第一步∶联络员 </p>
<p>　　推动Tremor前进的是25万名青少年，宝洁称他们为&#8220;联络员&#8221;。据诺克斯说，从宝洁的最初研究中得出的主要启示就是，这些&#8220;联络员&#8221;自始至终活跃在产品为市场接受的过程中，因而他们有别于享有&#8220;潮流创新者&#8221;之称的潮流先驱和早期采用者。这些&#8220;潮流创新者&#8221;很了解消费者的需求。虽然他们能够迅速接受新产品和新理念，但是却不一定能构成口碑营销的通途大道；有些潮流先驱有可能成为口碑传播的死胡同，因为他们会把只有自己知道的秘密囤积起来，秘而不宣。 </p>
<p>　　而联络员却不同，即使他们是最后知道秘密的人，也会马上广而告之，告诉身边的人去关注某个新产品、一首酷歌、新电视节目或是新电影。诺克斯认为，这些人有着真正广泛深厚的社会关系网络，而且很愿意同他人交流。 </p>
<p>　　Tremor的广告宣传取得成功，全要靠这些联络员们的动动嘴、动动手指（敲键盘），因此宝洁投入了大量时间、设计了种种方法来识别他们。第一步是把青少年吸引到Tremor网站（Tremor.com）来。申请参加者一旦登陆，就有各种问题要回答（例如，每天你和多少人交谈？买了新产品有什么感想？）。通过这些问题可以发现候选人的八项个性特征。诺克斯告诉我们其中三个最重要的特征∶好奇，善于交际，善于游说。例如，一个典型联络员的密友名单上，一般都会有150~200个一有消息就联系的朋友。 </p>
<p>　　在筛选阶段，大概会有15%的申请者能够通过，这些人被称为Tremor的新成员。而没入选的也会被礼貌地拒绝∶&#8220;谢谢您对Tremor的关注。很抱歉，这次我们的申请人数已满。&#8221;入选者接着将进入&#8220;新兵训练营基地&#8221;接受严格的训练。Tremor运用各种新理念、新机会吸引他们。比如，Tremor曾发出一封电子邮件，邀请入选者为某部电影提供创意，邮件的标题就是&#8220;像好莱坞大腕那样思考&#8221;。 </p>
<p>　　其间，宝洁的员工通过网络在幕后监视他们是否行如其言。简言之，看看这些孩子怎么处理得到的第一口独一份的美味。接下来的就是Tremor的秘方调料了。有8~10%的最初申请者会获得联络员的身份（占目标群体的1%）。即使是更深入Tremor之后，这些正式成员仍然会受到秘密评估，而他们自己浑然不觉。诺克斯坦然承认了这一细节，可是却给Tremor自称的透明度罩上了一层阴影—对任何口碑营销来说，透明度可能都是引起人们争议的焦点吧。 </p>
<p>　　诺克斯深信，这个精英群体极具影响力，他们是营销人忽视的一支劲旅。的确，像交友网站Fraudster这样的品牌公司，还有BuzzMetrics等口碑营销公司正在拼命追踪联络员型消费者，又称市场影响者、传导者或是蜜蜂。但是，其他准备开展口碑营销的营销人担心这些影响者获得的影响力太大。 </p>
<p>　　这种辩论常常使Tremor和 BzzAgent陷于争斗之中。BzzAgent的客户包括家乐氏（Kellogg）, 拉尔夫劳伦（Ralph Lauren）和啤酒商 Anheuser-Busch等。这家公司自己没有健全的筛选志愿者的专利体系，它的做法是有多少人要多少人（到目前为止，它已拥已有8.6万名志愿者）。志愿者们在线申请，在线签约参加试用新产品，与亲朋好友及其他人交流对产品的感想，然后写成日记发送给BzzAgent。 </p>
<p>　　与Tremor不同，BzzAgent认为任何顾客——无论是家庭主妇还是首席执行官——都有可能和别人聊聊最新市场动向，而且大部分人也很乐于通过不同的人获得信息。BzzAgent的首席执行官大卫&#183;巴尔特说∶&#8220;在制造口碑方面，市场影响者并不比一般人做得更好。人人都可以成为我们的宣传员。&#8221;</p>
<p>　　口碑营销第二步∶有价值 </p>
<p>　　一谈到影响者的问题，大部分营销人都认为，如果传递信息的人没有诚意，口碑营销就是无效的。对Tremor来说，在精挑细选了联络员之后，只完成了可信的口碑营销的一半。公司还必须设法精心修饰产品，以便达到口碑营销的最佳效果。 </p>
<p>　　联络员的关系是在线形成的。但大多数情况下，联络员和产品之间的纽带是在线下结成的∶公司通过邮局寄发给他们礼品包，有贴画，DVD或是样品。Tremor和品牌代表们多次召开会议，反复讨论这些礼品包以及整个宣传活动，看看它们是否能体现两个要素∶可倡导与可扩大。 </p>
<p>　　可倡导和可扩大的模式是在理论、心理学知识、宝洁现有数据和Tremor的专利调研几个方面结合的基础上建立起来的。用Tremor的行话来说，当联络员自然地体验某种产品、喜欢上它并和同伴谈论它时，就是在倡导产品。诺克斯解释道∶&#8220;当联络员刚开始接触一个新想法，他首先会问自己∶&#8216;这个想法值得我广而告之吗？&#8217; 有价值才是他们在社会上&#8216;畅通无阻&#8217;的通行证，因而他们所宣传的必须是自己相信的东西。&#8221; </p>
<p>　　Tremor不会草率地下结论说一个联络员是否对某个产品有所反应。诺克斯说∶&#8220;我们有办法找到品牌值得倡导的关键要素，以及联络员倡导这个产品的理由。&#8221; </p>
<p>　　Tremor口碑营销模式中的第二个要素是可扩大，即某个产品信息或使用体验很容易为人所道，产品能自然而然地进入人们闲谈当中。诺克斯说∶&#8220;找到同时具备可倡导和可扩大潜力的口碑理念确非易事。&#8221; </p>
<p>　　因此，Tremor在开展广告活动之前，要先在一组联络员当中进行信息测试，来寻找最有效用的信息。诺克斯解释说∶&#8220;这样做，使我们在产品进入市场前就能够告诉客户说∶&#8216;看见这八个想法了吗？联络员不会谈论它们的。但是这个呢？这个才是他们的热门话题。&#8217;&#8221; </p>
<p>　　Tremor的广告要出色，关键取决于广告活动开始前所掌握的数据量。就是说，只有精心培育，才会产生大量有价值的热门话题。相比之下，BzzAgent的特色则是拥有一套流畅的反馈系统。BzzAgent培训大批&#8220;沟通开拓者&#8221;，要求他们每周仔细审阅4,000~7,000份数量可观的业务报告，并分别对每份报告做出总结。最后，再从中筛选出有用的信息绘制成图表提供给客户。 </p>
<p>　　撇开新品发布前期的精心筹划不谈，诺克斯强调，送给联络员的礼品包当中并没有指定的宣传语或是谈话要点。也就是说，即便Tremor竭尽所能培养联络员对产品的积极反应，这些青少年的行为仍是自发、真实的。可倡导和可放大性的要旨，就是&#8220;一些理由，使孩子们在自然而然的情形下对别人说：&#8216;嗨，我跟你说过某某产品吗？&#8217;&#8221; </p>
<p>　　他挑选的字眼儿&#8220;自然而然的情形&#8221;，在某些营销人听来，可能和&#8220;可扩大&#8221;及&#8220;联络员&#8221;这样的术语并不相称。难道人的情感刺激或体验真的可能如此地&#8220;收放自如&#8221;，像积木一样，可随意地拆分或组合？还堂而皇之地称之为&#8220;自然而然&#8221;？ </p>
<p>　　技术与互联网战略公司EchoDitto首席执行官尼科&#183;梅尔认为，自觉的口头宣传并不是真正的口碑宣传。他的公司创立了在线社区，帮助客户提升知名度，筹措资金。梅尔说∶&#8220;最成功的营销是润物细无声式的，不为人察觉。&#8221; 霍华德&#183;迪安2004年总统大选的网站智囊们备受赞誉，因为他们成功地运用了网志和其他互联网工具，拉拢了大批平民支持者。 </p>
<p>　　诺克斯非常清楚，当新鲜感消失，一切变得程式化，这些联络员就会逐渐感到厌倦。他说∶&#8220;这个问题让我夜不成眠。我必须和这些联络员保持一种关系，鼓励他们一直参与我们的活动。&#8221;为了使这些孩子们乐此不疲，Tremor每年只让联络员参加20次活动。 </p>
<p>　　Tremor还有其他办法防止联络员产生厌倦情绪。开展&#8220;影响力活动&#8221;，即在新品上市前邀请联络员出谋划策，还请他们为现有产品提建议。在Tremor网站上，宝洁用青少年们对产品产生的影响来鼓舞他们的士气。例如，一条大字标题这样写道∶&#8220;你告诉了佳洁士你需要什么样的产品！&#8221;在宣传香草和樱桃味可乐的&#8220;派对炫生活&#8221; 主题活动中，联络员提交了各种广告口号，网站上就打出这样的标题∶&#8220;你帮助可口可乐挑选了一个口号，它被贴在瓶上发送给了近百万人!&#8221; </p>
<p>　　据诺克斯说，这类广告活动本身可提倡和可扩大的程度很高，因为青少年个人与品牌有了直接联系。&#8220;联络员们可以对所有的朋友说∶&#8216;我帮那条广告挑选了音乐。&#8217;这自然而然就把这些孩子们的话题引向广告所涉及的产品了。&#8221; </p>
<p>　　又是那个字眼儿∶自然而然。　　 </p>
<p>　　口碑营销第三步∶看回报 </p>
<p>　　营销人备受印刷品和电视广告低迷回报率所困，不知如何才能贴近对媒体退避三舍的消费者群体。Tremor和其他的口碑营销公司引起了这些营销人的注意。出版商企鹅集团营销副总裁李克&#183;帕斯克切罗，四年前首次试水，委托BzzAgent运用口碑营销宣传推广一本企鹅小说。帕斯克切罗说，他现在正和BzzAgent合作实施第24个口碑营销计划。 </p>
<p>　　当营销人纷纷转向这个新媒介的时候，他们却没有必要的好办法来衡量它的回报。例如，Tremor的口碑营销差不多在联络员的宣传停止后就同时结束了。诺克斯承认说∶&#8220;我能评估口碑从Tremor到联络员的宣传效果，最多还能评估从联络员到他们最亲密的朋友的宣传效果。在此之后，就一无所知了。&#8221; </p>
<p>　　其他口碑营销公司寄希望于先进的口碑营销度量系统。Intelliseek等广告公司开发出各种方法，通过筛读1,100万个网志、信息板和其他网上社区，在线追踪某个品牌的口碑。在线社交网Friendster自诩拥有1,600万会员，声称能够通过追踪会员们在线联系的原因和方法来测量第二级、第三级口碑营销的效果。BuzzMetrics则提供一系列口碑调研和规划服务。他们开发了一项综合服务，用户申请该服务后，每季度都会收到有关某行业各个子市场中（如营养行业）可识别的影响者在线活动的报告和简报。 </p>
<p>　　BuzzMetrics目前向七家最大的食品公司提供该项服务。 </p>
<p>　　BuzzMetrics总裁和首席执行官乔纳森&#183;卡森说∶&#8220;上千万的消费者在庞大数码数据支持的环境里参与口碑营销活动，这为口碑营销的衡量带来了巨大的可能性，也带来了营销人渴求的消费者责任感。&#8221; </p>
<p>　　诺克斯指出，相对而言，Tremor的绝大多数客户更关注的是在采用了口碑营销的领域中销售状况如何，而并不是自己的品牌在网络世界里有多大的反响。销售曲线不断出现高峰，这才是驱使帕斯克切罗与BzzAgent继续合作的原因。 </p>
<p>　　他说∶&#8220;和BzzAgent的很多客户一样，我也不怎么看公司提供的图表。&#8221;帕斯克切罗更感兴趣的不是BzzAgent复杂的反馈过程，而是反馈的结果。举例说明，2001年9月11日企鹅出版集团出版了一本名为《神酷的艺术》（The Art of Shen Ku）的书。帕斯克切罗用尽了印刷品广告等各种促销手段，但是该书出版一年仍是无人问津。于是他决定尝试口碑营销，期望能让这本书&#8220;起死回生&#8221;。六个月之后，销售额翻番。帕斯克切罗说∶&#8220;如果要在印刷品广告和口碑营销之间选择，我会选择后者。&#8221; </p>
<p>　　这些成功的案例促使口碑营销在一个个新领域里遍地开花。Tremor感到对青少年受众采用的方法效果很好，现在决定向更贴近宝洁产品线的&#8220;妈妈&#8221;市场进军。诺克斯说，Tremor需要修改一些筛选问题，例如，把妈妈们&#8220;即时通讯名单中的好朋友数量&#8221;改成&#8220;参加的机构数量&#8221;，而联络员的基本概念则会保持不变。Tremor还在尝试其他的招募方法，以便能够捕获这个对技术不敏感、也不怎么上网的消费群体。 </p>
<p>　　Tremor和客户把目光投向了口碑营销的下一个应用领域—客户保留。诺克斯一直主张，用口碑营销打造品牌忠诚度，要用可倡导和可扩大模式做基础。他问道∶&#8220;是什么原因促使联络员从现在起四个月、或是九个月、或是一年半以内向别人谈论某个产品呢？&#8221;&#8220;我们正和几个客户合作，利用口碑营销来打造会持续多年的长期忠诚度计划。&#8221; </p>
<p>　　他当然不会说出这些客户的名字，但是如果现行模式能透露什么的话，这些客户一定会享受到一项慷慨的服务套餐，包含有Tremor专用词、影响者信条和热议话题预测等口碑营销科学的种种术语。</p>
<p><br>&nbsp;</p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/46261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-07-03 11:03 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/07/03/46261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转一研究mysql全文索引的好文,对于小站做简单搜索特有用</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/07/02/46242.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Wed, 02 Jul 2008 11:21:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/07/02/46242.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/46242.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/07/02/46242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/46242.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/46242.html</trackback:ping><description><![CDATA[<div>全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表，可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库，将数据装载到一个没有 FULLTEXT 索引的表中，然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引，这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中，将是非常慢的。<br><br>全文搜索通过 MATCH() 函数完成。<br><br><span>mysql</span><span>&gt;</span><span> CREATE TABLE articles (<br></span><span>-&gt;</span><span> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,<br></span><span>-&gt;</span><span> title VARCHAR(</span><span>200</span><span>),<br></span><span>-&gt;</span><span> body TEXT,<br></span><span>-&gt;</span><span> FULLTEXT (title,body)<br></span><span>-&gt;</span><span> );<br>Query OK, </span><span>0</span><span> rows affected (</span><span>0.00</span><span> sec)<br><br>mysql</span><span>&gt;</span><span> INSERT INTO articles VALUES<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>MySQL Tutorial</span><span>'</span><span>, </span><span>'</span><span>DBMS stands for DataBase ...</span><span>'</span><span>),<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>How To Use MySQL Efficiently</span><span>'</span><span>, </span><span>'</span><span>After you went through a ...</span><span>'</span><span>),<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>Optimising MySQL</span><span>'</span><span>,</span><span>'</span><span>In this tutorial we will show ...</span><span>'</span><span>),<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>1001 MySQL Tricks</span><span>'</span><span>,</span><span>'</span><span>1. Never run mysqld as root. 2. ...</span><span>'</span><span>),<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>MySQL vs. YourSQL</span><span>'</span><span>, </span><span>'</span><span>In the following database comparison ...</span><span>'</span><span>),<br></span><span>-&gt;</span><span> (NULL,</span><span>'</span><span>MySQL Security</span><span>'</span><span>, </span><span>'</span><span>When configured properly, MySQL ...</span><span>'</span><span>);<br>Query OK, </span><span>6</span><span> rows affected (</span><span>0.00</span><span> sec)<br>Records: </span><span>6</span><span> Duplicates: </span><span>0</span><span> Warnings: </span><span>0</span><span><br><br>mysql</span><span>&gt;</span><span> SELECT </span><span>*</span><span> FROM articles<br></span><span>-&gt;</span><span> WHERE MATCH (title,body) AGAINST (</span><span>'</span><span>database</span><span>'</span><span>);<br></span><span>+----+-------------------+------------------------------------------+</span><span><br></span><span>|</span><span> id </span><span>|</span><span> title </span><span>|</span><span> body </span><span>|</span><span><br></span><span>+----+-------------------+------------------------------------------+</span><span><br></span><span>|</span><span> </span><span>5</span><span> </span><span>|</span><span> MySQL vs. YourSQL </span><span>|</span><span> In the following database comparison ... </span><span>|</span><span><br></span><span>|</span><span> </span><span>1</span><span> </span><span>|</span><span> MySQL Tutorial </span><span>|</span><span> DBMS stands </span><span>for</span><span> DataBase ... </span><span>|</span><span><br></span><span>+----+-------------------+------------------------------------------+</span><span><br></span><span>2</span><span> rows </span><span>in</span><span> </span><span>set</span><span> (</span><span>0.00</span><span> sec)<br><br>&nbsp;函数 MATCH() 对照一个文本集(包含在一个 FULLTEXT 索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 AGAINST() 的参数被给定。搜索以忽略字母大小写的方式执行。对于表中的每个记录行，MATCH() 返回一个相关性值。即，在搜索字符串与记录行在 MATCH() 列表中指定的列的文本之间的相似性尺度。 <br><br>当 MATCH() 被使用在一个 WHERE 子句中时 (参看上面的例子)，返回的记录行被自动地以相关性从高到底的次序排序。相关性值是非负的浮点数字。零相关性意味着不相似。相关性的计算是基于：词在记录行中的数目、在行中唯一词的数目、在集中词的全部数目和包含一个特殊词的文档(记录行)的数目。 <br><br>它也可以执行一个逻辑模式的搜索。这在下面的章节中被描述。 <br><br>前面的例子是函数 MATCH() 使用上的一些基本说明。记录行以相似性递减的顺序返回。 下一个示例显示如何检索一个明确的相似性值。如果即没有 WHERE 也没有 ORDER BY 子句，返回行是不排序的。 <br><br><span>mysql</span><span>&gt;</span><span> SELECT id,MATCH (title,body) AGAINST (</span><span>'</span><span>Tutorial</span><span>'</span><span>) FROM articles;<br></span><span>+----+-----------------------------------------+</span><span><br></span><span>|</span><span> id </span><span>|</span><span> MATCH (title,body) AGAINST (</span><span>'</span><span>Tutorial</span><span>'</span><span>) </span><span>|</span><span><br></span><span>+----+-----------------------------------------+</span><span><br></span><span>|</span><span> </span><span>1</span><span> </span><span>|</span><span> </span><span>0.64840710366884</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>2</span><span> </span><span>|</span><span> </span><span>0</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>3</span><span> </span><span>|</span><span> </span><span>0.66266459031789</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>4</span><span> </span><span>|</span><span> </span><span>0</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>5</span><span> </span><span>|</span><span> </span><span>0</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>6</span><span> </span><span>|</span><span> </span><span>0</span><span> </span><span>|</span><span><br></span><span>+----+-----------------------------------------+</span><span><br></span><span>6</span><span> rows </span><span>in</span><span> </span><span>set</span><span> (</span><span>0.00</span><span> sec) </span><br>下面的示例更复杂一点。查询返回相似性并依然以相似度递减的次序返回记录行。为了完成这个结果，你应该指定 MATCH() 两次。这不会引起附加的开销，因为 MySQL 优化器会注意到两次同样的 MATCH() 调用，并只调用一次全文搜索代码。<br><br><span>mysql</span><span>&gt;</span><span> SELECT id, body, MATCH (title,body) AGAINST<br></span><span>-&gt;</span><span> (</span><span>'</span><span>Security implications of running MySQL as root</span><span>'</span><span>) AS score<br></span><span>-&gt;</span><span> FROM articles WHERE MATCH (title,body) AGAINST<br></span><span>-&gt;</span><span> (</span><span>'</span><span>Security implications of running MySQL as root</span><span>'</span><span>);<br></span><span>+----+-------------------------------------+-----------------+</span><span><br></span><span>|</span><span> id </span><span>|</span><span> body </span><span>|</span><span> score </span><span>|</span><span><br></span><span>+----+-------------------------------------+-----------------+</span><span><br></span><span>|</span><span> </span><span>4</span><span> </span><span>|</span><span> </span><span>1</span><span>. Never run mysqld </span><span>as</span><span> root. </span><span>2</span><span>. ... </span><span>|</span><span> </span><span>1.5055546709332</span><span> </span><span>|</span><span><br></span><span>|</span><span> </span><span>6</span><span> </span><span>|</span><span> When configured properly, MySQL ... </span><span>|</span><span> </span><span>1.31140957288</span><span> </span><span>|</span><span><br></span><span>+----+-------------------------------------+-----------------+</span><span><br></span><span>2</span><span> rows </span><span>in</span><span> </span><span>set</span><span> (</span><span>0.00</span><span> sec)<br><br>MySQL 使用一个非常简单的剖析器来将文本分隔成词。一个&#8220;词&#8221;是由文字、数据、&#8220;'&#8221; 和 &#8220;_&#8221; 组成的任何字符序列。任何在 stopword 列表上出现的，或太短的(3 个字符或更少的)的 &#8220;word&#8221; 将被忽略。 <br><br>在集和查询中的每个合适的词根据其在集与查询中的重要性衡量。这样，一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重)，因为在这个特定的集中，它有较低的语义值。否则，如果词是较少的，它将得到一个较高的权重。然后，词的权重将被结合用于计算记录行的相似性。 <br><br>这样一个技术工作可很好地工作与大的集(实际上，它会小心地与之谐调)。 对于非常小的表，词分类不足以充份地反应它们的语义值，有时这个模式可能产生奇怪的结果。 <br><br><span>mysql</span><span>&gt;</span><span> SELECT </span><span>*</span><span> FROM articles WHERE MATCH (title,body) AGAINST (</span><span>'</span><span>MySQL</span><span>'</span><span>);<br>Empty </span><span>set</span><span> (</span><span>0.00</span><span> sec)<br><br>在上面的例子中，搜索词 MySQL 却没有得到任何结果，因为这个词在超过一半的记录行中出现。同样的，它被有效地处理为一个 stopword (即，一个零语义值的词)。这是最理想的行为 -- 一个自然语言的查询不应该从一个 1GB 的表中返回每个次行(second row)。 <br><br>匹配表中一半记录行的词很少可能找到相关文档。实际上，它可能会发现许多不相关的文档。我们都知道，当我们在互联网上通过搜索引擎试图搜索某些东西时，这会经常发生。因为这个原因，在这个特殊的数据集中，这样的行被设置一个低的语义值。 <br><br>到 4.0.1 时，MySQL 也可以使用 IN BOOLEAN MODE 修饰语来执行一个逻辑全文搜索。 <br><br><span>mysql</span><span>&gt;</span><span> SELECT </span><span>*</span><span> FROM articles WHERE MATCH (title,body)<br></span><span>-&gt;</span><span> AGAINST (</span><span>'</span><span>+MySQL -YourSQL</span><span>'</span><span> IN BOOLEAN MODE);<br></span><span>+----+------------------------------+-------------------------------------+</span><span><br></span><span>|</span><span> id </span><span>|</span><span> title </span><span>|</span><span> body </span><span>|</span><span><br></span><span>+----+------------------------------+-------------------------------------+</span><span><br></span><span>|</span><span> </span><span>1</span><span> </span><span>|</span><span> MySQL Tutorial </span><span>|</span><span> DBMS stands </span><span>for</span><span> DataBase ... </span><span>|</span><span><br></span><span>|</span><span> </span><span>2</span><span> </span><span>|</span><span> How To Use MySQL Efficiently </span><span>|</span><span> After you went through a ... </span><span>|</span><span><br></span><span>|</span><span> </span><span>3</span><span> </span><span>|</span><span> Optimising MySQL </span><span>|</span><span> In </span><span>this</span><span> tutorial we will show ... </span><span>|</span><span><br></span><span>|</span><span> </span><span>4</span><span> </span><span>|</span><span> </span><span>1001</span><span> MySQL Tricks </span><span>|</span><span> </span><span>1</span><span>. Never run mysqld </span><span>as</span><span> root. </span><span>2</span><span>. ... </span><span>|</span><span><br></span><span>|</span><span> </span><span>6</span><span> </span><span>|</span><span> MySQL Security </span><span>|</span><span> When configured properly, MySQL ... </span><span>|</span><span><br></span><span>+----+------------------------------+-------------------------------------+</span><span> </span><br><br>这个查询返回所有包含词 MySQL 的记录行(注意： 50% 的阈值没有使用)，但是它没有包含词 YourSQL。注意，一个逻辑模式的搜索不会自动地以相似值的降序排序记录行。你可以从上面的结果出看得出来，最高的相似值(包含 MySQL 两次的那个) 最列在最后，而不是第一位。一个逻辑全文搜索即使在没有一个 FULLTEXT 索引的情况下也可以工作，然而它慢些。<br><br>逻辑全文搜索支持下面的操作符：&#8220;+&#8221; 一个领头的加号表示，该词必须出现在每个返回的记录行中，&#8220;-&#8221; 一个领头的减号表示，该词必须不出现在每个返回的记录行中。 <br><br>缺省的 (当既没有加号也没有负号被指定时)词是随意的，但是包含它的记录行将被排列地更高一点。这个模仿没有 IN BOLEAN MODE 修饰词的 MATCH() ... AGAINST() 的行为。 <br><br>&lt; &gt; 这两个操作符用于改变一个词的相似性值的基值。&lt; 操作符减少基值，&gt; 操作符则增加它。参看下面的示例。 <br><br>( ) 圆括号用于对子表达式中的词分组。 <br><br>~一个领头的否定号的作用象一个否定操作符，引起行相似性的词的基值为负的。它对标记一个噪声词很有用。一个包含这样的词的记录将被排列得低一点，但是不会被完全的排除，因为这样可以使用 - 操作符。 <br><br>* 一个星号是截断操作符。不想其它的操作符，它应该被追加到一个词后，不加在前面。 <br><br>" 短语，被包围在双引号"中，只匹配包含这个短语(字面上的，就好像被键入的)的记录行。 <br><br>这里是一些示例： <br><br>apple banana <br><br>找至少包含上面词中的一个的记录行 <br><br>1.+apple +juice ... 两个词均在被包含 <br>2.+apple macintosh ... 包含词 &#8220;apple&#8221;，但是如果同时包含 &#8220;macintosh&#8221;，它的排列将更高一些 <br>3.+apple -macintosh ... 包含 &#8220;apple&#8221; 但不包含 &#8220;macintosh&#8221; <br>4.+apple +(&gt;pie &lt;strudel) ... 包含 &#8220;apple&#8221; 和 &#8220;pie&#8221;，或者包含的是 &#8220;apple&#8221; 和 &#8220;strudel&#8221; (以任何次序)，但是&#8220;apple pie&#8221; 排列得比 &#8220;apple strudel&#8221; 要高一点 <br>5.apple* ... 包含 &#8220;apple&#8221;，&#8220;apples&#8221;，&#8220;applesauce&#8221; 和 &#8220;applet&#8221; <br>6."some words" ... 可以包含 &#8220;some words of wisdom&#8221;，但不是 &#8220;some noise words&#8221; <br><br><strong>全文的限制</strong> <br><br>* MATCH() 函数的所有参数必须是从来自于同一张表的列，同时必须是同一个FULLTEXT 索引中的一部分，除非 MATCH() 是 IN BOOLEAN MODE 的。 <br><br>* MATCH() 列列表必须确切地匹配表的某一 FULLTEXT 索引中定义的列列表，除非 MATCH() 是 IN BOOLEAN MODE 的。 <br><br>* AGAINST() 的参数必须是一个常量字符串。 <br><br><strong>微调 MySQL 全文搜索</strong> <br><br>不幸地，全文搜索仍然只有很少的用户可调参数，虽然增加一些在 TODO 上排列很高。如果你有一个 MySQL 源码发行(查看章节 2.3 安装一个 MySQL 源码发行)，你可以发挥对全文搜索的更多控制。 <br><br>注意，全文搜索为最佳的搜索效果，被仔细地调整了。修改默认值的行为，在大多数情况下，只会使搜索结果更糟。不要修改 MySQL 的源代码，除非你知道你在做什么！ <br><br>* 被索引的词的最小长度由 MySQL 变量 ft_min_word_len 指定。查看章节 4.5.6.4 SHOW VARIABLES。将它改为你所希望的值，并重建你的 FULLTEXT 索引。 (这个变量只从 MySQL 4.0 开始被支持) <br><br>* stopword 列表可以从 ft_stopword_file 变量指定的文件中读取。查看章节 4.5.6.4 SHOW VARIABLES。在修改了 stopword 列表后，重建你的 FULLTEXT 索引。(这个变量只从 MySQL 4.0.10 开始被支持) <br><br>* 50% 阈值选择由所选择的特殊的衡量模式确定。为了禁止它，修改 `myisam/ftdefs.h' 文件中下面的一行： <br><span>#define</span><span> GWS_IN_USE GWS_PROB</span> <br><br>改为：<br><br><span>#define</span><span> GWS_IN_USE GWS_FREQ <br><br>然后重新编译 MySQL。在这种情况下，不需要重建索引。 注意：使用了这个，将严重地减少 MySQL 为 MATCH() 提供足够的相似性值的能力。如果你确实需要搜索这样的公共词，最好使用 IN BOOLEAN MODE 的搜索代替，它不遵守 50% 的阈值。 <br><br>* 有时，搜索引擎维护员希望更改使用于逻辑全文搜索的操作符。这些由变量 ft_boolean_syntax 定义。然而，这个变量是只读的，它的值在 `myisam/ft_static.c' 中被设置。 <br><br>对于这些更改，要求你重建你的 FULLTEXT 索引，对于一个 MyISAM 表，最容易的重建索引文件的方式如下面的语句： <br><span>mysql</span><span>&gt;</span><span> REPAIR TABLE tbl_name QUICK; <br><br><strong>全文搜索 TODO </strong>* 使所有对 FULLTEXT 索引的操作更快 <br><br>* 邻近(Proximity)操作符 <br><br>* 对 "always-index words" 的支持。他们可以是用户希望视为一个词处理的任意字符串，例如 "C++"、"AS/400"、"TCP/IP"，等等 <br><br>* 支持在 MERGE 表中的全文搜索 <br><br>* 对多字节字符的支持 <br><br>* 依照数据的语言建立 stopword 列表 <br><br>* Stemming (当然，依赖于数据的语言) <br><br>* Generic user-suppliable UDF preparser. <br><br>* 使模式更加灵活 (通过为 CREATE/ALTER TABLE 中的 FULLTEXT 增加某些可调整参数)</span></span></span></span></span> </div><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/46242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-07-02 19:21 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/07/02/46242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三种主流WEB架构的开发现状与未来展望[转]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/06/05/45035.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Thu, 05 Jun 2008 12:58:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/06/05/45035.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/45035.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/06/05/45035.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/45035.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/45035.html</trackback:ping><description><![CDATA[<p>三种主流WEB架构的开发现状与未来展望</p>
<p>做WEB好几年了，各种语言和技术都稍有涉猎。今天心血来潮，突然想总结一下。其实不论什么技术，什么需求，通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库，很多东西都是相通的。这里说的WEB架构，是指WEB应用开发中每种技术独有的资源组织形式（包括文件，数据库，HTTP请求处理等。注意并非OO的开发方式才有架构一说），也许说开发方式更容易让人理解一些。 </p>
<p>以下想法主要以PHP实现为示例，但很多体会我想Java，.NET，Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphi fo PHP的想法。 </p>
<p>　　WEB程序的架构基本上可以分成以下三类： </p>
<p>　　(一) 基于&#8220;WEB页面/文件&#8221;，例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里，与URL相对应。当HTTP请求提交至服务器时，URL直接指向某个文件，然后由该文件来处理请求，并返回响应结果。 </p>
<p>　　比如<a href="http://www.website.conm/news/readnews.php?id=1234">http://www.website.conm/news/readnews.php?id=1234</a> </p>
<p>　　可以想像，我们在站点根目录的news目录下放置一个readnews.php文件。 </p>
<p>　　这种开发方式最自然，最易理解，也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好，不过你可以用服务器提供的URL重写方案来处理，例如Apache的mod_rewrite。 </p>
<p>　　(二) 基于&#8220;动作&#8221;(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java)，Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action)，由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样，都是请求/响应驱动的方案，离不开HTTP。 </p>
<p>　　比如 <a href="http://www.website.com/news/read/id/1234">http://www.website.com/news/read/id/1234</a> </p>
<p>　　可以想像在实际代码中，我们会有一个控制器newsController，其中有一个readAction。不同框架可能默认实现方式稍有不同，有的是一个Controller一个文件，其中有多个Action，有的是每个Action一个文件。当然这些你都可以自己控制，题外话。 </p>
<p>　　这种方式的URL通常都很漂亮，对搜索引擎友好，因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。 </p>
<p>　　另外，还有更直接的基于URL的设计方案，那就是REST。通过人为规定URL的构成形式（比如Action限制成只有几种）来促进网站之间的互相访问，降低开发的复杂性，提高系统的可伸缩性。REST对于Web Services来说是一个创新。 </p>
<p>　　虽然本文讨论的是单个项目所采用的架构，而REST是为了解决网站之间的通讯问题，但REST的出现，会对单个项目的架构造成影响（很显然你在开发时就要构造规范的URL）。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持，Zend Framework也提供了Zend_Rest来支持REST，包括Server和Client。</p>
<p>(三) 基于&#8220;组件&#8221;（Component ，GUI设计也常称控件）、事件驱动的架构，最常见的是微软的.NET。基本思想是把程序分成很多组件，每个组件都可以触发事件，调用特定的事件处理器来处理（比如在一个HTML按钮上设置onClick事件链接到一个PHP函数）。这种设计远离HTTP，HTTP请求完全抽象，映射到一个事件。 </p>
<p>　　事实上这种设计原本最常应用于传统桌面GUI程序的开发，例如Delphi，Java Swing等。所有表现层的组件比如窗口，或者HTML表单都可以由IDE来提供，我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件，并且添加一个相应的事件处理器。 </p>
<p>　　这种开发方式有几个优点： </p>
<p>　　复用性 -代码高度可重用。 </p>
<p>　　易于使用 -通常只需要配置控件的属性，编写相关的事件处理函数。 </p>
<p>　　我个人也挺喜欢这种方式，PEAR就提供了相当强大的HTML_QuickForm，用于在页面添加表单元素及其事件处理函数，还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能，在项目中的某些部份使用QuickForm，有时可以大大加快开发。 </p>
<p>　　而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜，PRADO就是一个这样的框架，曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢？ </p>
<p>　　我觉得主要有以下两个问题： </p>
<p>　　(1)效率问题 </p>
<p>　　这里指的不是开发效率，而是代码的执行效率。众所周知，正常情况下，PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存，可以说很多站点根本不能使用Prado这样的框架，比如门户网站，大型论坛等。 </p>
<p>　　但ASP .NET不太一样，因为它是编译型的框架，最后生成的代码是编译生成的，不需要再次进行中间过程的诸多处理，所以在第一次执行之后速度会很快，执行效率还是很高的。　这是语言层次的功能，Prado无法通过代码层次的努力完全弥补。 </p>
<p>　　(2)没有强大的IDE支持 </p>
<p>　　设置控件的属性，添加其对应的事件处理器，看似简单，但控件多了，这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来，设置属性很方便，事件处理器也会自动添加。Prado目前没有这样的IDE支持。 </p>
<p>　　总之，这种基于控件的框架比较适合于用户交互较多的，需要对页面中的很多组件设置不同处理操作，但对于性能要求不高的应用。另外，带有组件支持的框架通常对AJAX的支持都较好，比如.NET和Ruby on Rails。 </p>
<p>　　综上，三种架构基本上可以代表目前的所有主流WEB开发方式，包括PHP,JavaEE,.NET,Ruby/RoR。 </p>
<p>目前PHP开发的状况和未来的趋势： </p>
<p>　　平时做PHP比较多，特别总结一下PHP开发的趋势。目前在PHP开发中，我们最常用的是基于&#8220;文件&#8221;的架构，其实也就是一种&#8220;面向过程&#8221;的开发方式。通常我们写PHP程序的目的就是&#8220;快点上线，让程序跑起来&#8221;。而且大多数PHP程序员还要和HTML、CSS做近身搏斗，所以如果程序太抽象，调整视觉效果就比较困难。所以对于小项目，这是一个最好的选择。 </p>
<p>　　但越来越多人认识到，面向对象和MVC框架更能促进代码的复用和分享，而且程序易于扩展，随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework，各自拥有活跃的社区和庞大的用户群，都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路，致力于快速开发，而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟，加上PHP原本开发社区的庞大人数，将来也许又会再产生出一些行业性的标准。 </p>
<p>　　这种选择适合于中大型项目，特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。 </p>
<p>　　而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力，例如Codegear的Delphi for PHP，就吸引了很多人的关注。如果有强大的商业支持，也许将来在开发市场也会占一席之地。 </p>
<p>　　我会在下一篇文章介绍D4P的新特性并作评测。 </p>
<p>　　WEB开发的未来展望： </p>
<p>　　随着更贴近HTTP的REST的流行，我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。 </p>
<p>　　AJAX是一把双刃剑，尽管事件驱动的架构看起来非常适合于处理异步的请求（可以想像页面中存在几个组件，每个组件都可以触发异步请求，对应对服务器端的某个事件处理器，看起来是很理想的一个处理方式），但要为客户端自动生成良好的JavaScript代码是很不容易的，要满足各种浏览器的兼容性要求，还要能够自己进行扩展，以满足项目中千奇百怪的需求。 很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果，而不是在服务器端生成。在服务器端生成JS的两个结果，一是对生成的代码不信任，二是人变傻，因为你并不知道真正发生了什么。 </p>
<p>　　关于WEB开发的个人疑惑： </p>
<p>　　为了让开发更简单，我们不得不学习使用复杂的开发工具和框架，这到底是一个进步，还是退步？ </p>
<p>　　IDE让程序员变聪明还是变傻？ 当我们在服务器代码里面就可以设计客户端界面，这是一个进步还是退步？ </p>
<p>　　举个例子说，微软的ASP.NET AJAX，让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript，不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果，靠IDE和框架无法自动完成，你要怎么办？　到这个时候再来学JS，也许就迟了。更可怕的是，技术在更新和淘汰，可能十年之后，你会发现自己除了各种IDE之后，真正精通的技术很少，脱离了IDE你写一个小程序都要查半天API手册，因为你平时都是依赖&#8220;自动补齐&#8221;来写代码的！ 这样的情景，我想没有人愿意发生。 </p>
<p>　　也许对于短期开发的项目来说，是一个进步，但对于程序员个人的成长来说，这并不是好事。对工具的依赖，导致了我们对于底层和核心技术的不求甚解，限制了个人的成长。<br></p><img src ="http://www.cnitblog.com/aliyiyi08/aggbug/45035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/aliyiyi08/" target="_blank">阿里爸爸</a> 2008-06-05 20:58 <a href="http://www.cnitblog.com/aliyiyi08/archive/2008/06/05/45035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决tsvncache.exe引起电脑慢的问题[SVN使用技巧]</title><link>http://www.cnitblog.com/aliyiyi08/archive/2008/05/23/44198.html</link><dc:creator>阿里爸爸</dc:creator><author>阿里爸爸</author><pubDate>Fri, 23 May 2008 10:08:00 GMT</pubDate><guid>http://www.cnitblog.com/aliyiyi08/archive/2008/05/23/44198.html</guid><wfw:comment>http://www.cnitblog.com/aliyiyi08/comments/44198.html</wfw:comment><comments>http://www.cnitblog.com/aliyiyi08/archive/2008/05/23/44198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/aliyiyi08/comments/commentRss/44198.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/aliyiyi08/services/trackbacks/44198.html</trackback:ping><description><![CDATA[<div class=sect3 lang=zh-CN XML:LANG="zh-CN">如果你觉得SVN的cache程序使得你的机器反应很慢的话,那可以参考这个方案.不过可能要改变你以前使用习惯.<br>这个方案有两部分,第一部分是关闭SVN的cache监视;第二部分是显示文件差异时,使用SVN的&#8220;check for modifications&#8221;显示差异。 <br>1.关闭SVN的cache监视。即关闭tsvncache.exe这个程序对目录的监视。<br>具体操作步骤如下：<br>a) 右击任意目录打开右键菜单,打开"tortoisesvn" =&gt; "settings"下的设置窗口<br>b) 找到"icon overlays"的设置项，将"status cache"设置成"none"<br>2.使用SVN的&#8220;check for modifications&#8221;显示差异<br>具体操作步骤如下：<br>a) 右击需要比较差异的目录，打开右键菜单，打开"tortoisesvn" =&gt; "check for modifications"，打开比较差异窗口<br>注：这样显示文件差异是因为上面关闭监视后，再有修改程序文件，文件夹不再更新修改标识了，无法再通过查看文件平图标来知道是否有文件修改。<br>&nbsp;<br>今天本人这样修改了，感觉机器强多了！不再有explorer疆死的情况了！爽！<br>&nbsp;<br>以下是SVN设置框中具体的设置的介绍(摘自:http://tortoisesvn.net/docs/release/TortoiseSVN_zh_CN/tsvn-dug-settings.html)<br>&nbsp;<br>
<h4 class=title>&nbsp;</h4>
<div class=figure>图标叠加设置<a id=tsvn-dug-settings-dia-overlay name=tsvn-dug-settings-dia-overlay></a>
<p class=title><strong>图&nbsp;5.43.&nbsp;设置对话框，外观与样式页面</strong></p>
<div><img alt=设置对话框，外观与样式页面 src="http://tortoisesvn.net/docs/release/TortoiseSVN_zh_CN/images/SettingsOverlay.png"></div>
</div>
<p>此页面允许你选择TSVN为哪些条目显示图标覆盖。选择网络磁盘可能会非常慢，所以默认情况下不为定位于网络共享中的工作副本显示图标覆盖。你甚至可以取消所有的图标覆盖，但那样做还剩下什么好玩儿的呢？</p>
<p>USB闪存看上去是个特殊情况，因为驱动类型是设备自主标识的。于是有些显示为固定驱动器，而有些显示为可移动磁盘。</p>
<p>By default, overlay icons will appear in all open/save dialogs as well as in Windows Explorer. If you want them to appear <span class=emphasis><em>only</em></span> in Windows Explorer, check the <span class=guilabel>Show overlays only in explorer</span> box.</p>
<p>Since it takes quite a while to fetch the status of a working copy, TortoiseSVN uses a cache to store the status in so the explorer doesn't get hogged too much when showing the overlays. You can choose which type of cache TortoiseSVN should use