<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/styles/rss.css" type="text/css"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns="http://purl.org/rss/1.0/"
>
 <channel rdf:about="http://16hot.blog.isyi.com/rss/rss10/1">
  <title>16hot 的博客</title>
  <link>http://16hot.blog.isyi.com</link>
  <description>16hot 一心想要建设一个公共平台给所有有需要的朋友使用。
但是，在这里留给自己一块空间，抒发自己的心情。</description>
    <dc:creator>16hot</dc:creator>
  <dc:date>2008-11-19T19:48:41Z</dc:date>
  <admin:generatorAgent rdf:resource="http://www.lifetype.net" />
  <items>
   <rdf:Seq>
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/849" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/848" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/847" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/846" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/845" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/810" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/659" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/661" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/660" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/658" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/652" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/651" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/650" />
       <rdf:li rdf:resource="http://16hot.blog.isyi.com/post/1/600" />
      </rdf:Seq>
  </items> 
 </channel>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/849">
  <title>用mysqlslap对MySQL进行压力测试（转）</title>
  <link>http://16hot.blog.isyi.com/post/1/849</link>
  <dc:description>MySQL5.1地的确提供了好多有力的工具来帮助我们DBA进行数据库管理。&lt;br /&gt;现在看一下这个压力测试工具mysqlslap.&lt;br /&gt;关于他的选项手册上以及--help介绍的很详细。&lt;br /&gt;我解释一下一些常用的选项。&lt;br /&gt;这里要注意的几个选项：&lt;br /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--concurrency代表并发数量，多个可以用逗号隔开，当然你也可以用自己的分隔符隔开，这个时候要用到--delimiter开关。&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--engines代表要测试的引擎，可以有多个，用分隔符隔开。&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--iterations代表要运行这些测试多少次。&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--auto-generate-sql 代表用系统自己生成的SQL脚本来测试。&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--auto-generate-sql-load-type 代表要测试的是读还是写还是两者混合的（read,write,update,mixed）&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--number-of-queries 代表总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算。比如倒数第二个结果2=200/100。&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--debug-info 代表要额外输出CPU以及内存的相关信息。&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--number-int-cols 代表示例表中的INTEGER类型的属性有几个。&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--number-char-cols 意思同上。&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--create-schema 代表自己定义的模式（在MySQL中也就是库）。&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--query 代表自己的SQL脚本。&lt;/span&gt;&lt;br style=&quot;color: #009902&quot; /&gt;&lt;span style=&quot;color: #009902&quot;&gt;--only-print 如果只想打印看看SQL语句是什么，可以用这个选项。&lt;/span&gt;&lt;br /&gt;&lt;br style=&quot;color: #ff0102&quot; /&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;color: #ff0102&quot;&gt;现在来看一些我测试的例子。&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0001ff&quot;&gt;1、用自带的SQL脚本来测试。&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0080ff&quot;&gt;MySQL版本为5.1.23&lt;br /&gt;&lt;/span&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;[&lt;/span&gt;root&lt;span style=&quot;color: #0000cc&quot;&gt;@&lt;/span&gt;localhost &lt;span style=&quot;color: #0000cc&quot;&gt;~&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;#&lt;/span&gt; mysqlslap &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;defaults&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;usr&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;local&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;mysql&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;maria&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;my&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;cnf &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;concurrency&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;50&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;100&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;200 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;iterations&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;1 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;number&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;int&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;cols&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;4 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;number&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;cols&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;35 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;auto&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;generate&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;sql &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;auto&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;generate&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;sql&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;add&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;autoincrement &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;auto&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;generate&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;sql&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;load&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;mixed &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;engine&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;myisam&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;innodb &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;number&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;of&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;queries&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;200 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;debug&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;info&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;uroot &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;p1 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;S&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;tmp&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;mysql_3310&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;sock&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Benchmark&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Running for engine myisam&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of seconds to run all queries: 0.063 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Minimum number of seconds to run all queries: 0.063 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum number of seconds to run all queries: 0.063 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of clients running queries: 50&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of queries per client: 4&lt;br /&gt;&lt;br /&gt;Benchmark&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Running for engine myisam&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of seconds to run all queries: 0.070 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Minimum number of seconds to run all queries: 0.070 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum number of seconds to run all queries: 0.070 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of clients running queries: 100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of queries per client: 2&lt;br /&gt;&lt;br /&gt;Benchmark&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Running for engine myisam&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of seconds to run all queries: 0.092 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Minimum number of seconds to run all queries: 0.092 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum number of seconds to run all queries: 0.092 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of clients running queries: 200&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of queries per client: 1&lt;br /&gt;&lt;br /&gt;Benchmark&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Running for engine innodb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of seconds to run all queries: 0.115 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Minimum number of seconds to run all queries: 0.115 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum number of seconds to run all queries: 0.115 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of clients running queries: 50&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of queries per client: 4&lt;br /&gt;&lt;br /&gt;Benchmark&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Running for engine innodb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of seconds to run all queries: 0.134 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Minimum number of seconds to run all queries: 0.134 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum number of seconds to run all queries: 0.134 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of clients running queries: 100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of queries per client: 2&lt;br /&gt;&lt;br /&gt;Benchmark&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Running for engine innodb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of seconds to run all queries: 0.192 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Minimum number of seconds to run all queries: 0.192 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum number of seconds to run all queries: 0.192 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of clients running queries: 200&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of queries per client: 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;User time 0.06, System time 0.15&lt;br /&gt;Maximum resident set size 0, Integral resident set size 0&lt;br /&gt;Non-physical pagefaults 5803, Physical pagefaults 0, Swaps 0&lt;br /&gt;Blocks in 0 out 0, Messages in 0 out 0, Signals 0&lt;br /&gt;Voluntary context switches 8173, Involuntary context switches 528&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0080ff&quot;&gt;我来解释一下结果的含义。&lt;/span&gt;&lt;br style=&quot;color: #0080ff&quot; /&gt;&lt;span style=&quot;color: #0080ff&quot;&gt;拿每个引擎最后一个Benchmark示例。&lt;/span&gt;&lt;br style=&quot;color: #0080ff&quot; /&gt;&lt;span style=&quot;color: #0080ff&quot;&gt;对于INNODB引擎，200个客户端同时运行这些SQL语句平均要花0.192秒。相应的MYISAM为0.092秒。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0001ff&quot;&gt;2、用我们自己定义的SQL 脚本来测试。&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0080ff&quot;&gt;这些数据在另外一个MySQL实例上。版本为5.0.45&lt;/span&gt;&lt;br style=&quot;color: #0080ff&quot; /&gt;&lt;span style=&quot;color: #0080ff&quot;&gt;先看一下这两个表的相关数据。&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0001ff&quot;&gt;1）、总记录数。&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;mysql&lt;span style=&quot;color: #0000cc&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;select&lt;/span&gt; table_rows &lt;span style=&quot;color: #0000ff&quot;&gt;as&lt;/span&gt; rows &lt;span style=&quot;color: #0000ff&quot;&gt;from&lt;/span&gt; information_schema&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;tables &lt;span style=&quot;color: #0000ff&quot;&gt;where&lt;/span&gt; table_schema&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;t_girl&amp;#39;&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;and&lt;/span&gt; table_name&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt; rows &amp;nbsp;   &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt; 296693 &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; 1 row &lt;span style=&quot;color: #0000ff&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;0&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;01 sec&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; mysql&lt;span style=&quot;color: #0000cc&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;select&lt;/span&gt; table_rows &lt;span style=&quot;color: #0000ff&quot;&gt;as&lt;/span&gt; rows &lt;span style=&quot;color: #0000ff&quot;&gt;from&lt;/span&gt; information_schema&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;tables &lt;span style=&quot;color: #0000ff&quot;&gt;where&lt;/span&gt; table_schema&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;t_girl&amp;#39;&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;and&lt;/span&gt; table_name&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;category&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt; rows &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt;  113&amp;nbsp; &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; 1 row &lt;span style=&quot;color: #0000ff&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;0&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;00 sec&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style=&quot;color: #0001ff&quot;&gt;2）、总列数。&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;mysql&lt;span style=&quot;color: #0000cc&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;select&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;as&lt;/span&gt; column_total &lt;span style=&quot;color: #0000ff&quot;&gt;from&lt;/span&gt; information_schema&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;columns &lt;span style=&quot;color: #0000ff&quot;&gt;where&lt;/span&gt; table_schema &lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;t_girl&amp;#39;&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;and&lt;/span&gt; table_name &lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt; column_total &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt;           32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; 1 row &lt;span style=&quot;color: #0000ff&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;0&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;01 sec&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; mysql&lt;span style=&quot;color: #0000cc&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;select&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;count&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;as&lt;/span&gt; column_total &lt;span style=&quot;color: #0000ff&quot;&gt;from&lt;/span&gt; information_schema&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;columns &lt;span style=&quot;color: #0000ff&quot;&gt;where&lt;/span&gt; table_schema &lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;t_girl&amp;#39;&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;and&lt;/span&gt; table_name &lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;category&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt; column_total &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;|&lt;/span&gt;            9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #0000cc&quot;&gt;| &lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;+&lt;/span&gt;&lt;br /&gt; 1 row &lt;span style=&quot;color: #0000ff&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;0&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;01 sec&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0001ff&quot;&gt;3）、调用的存储过程&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;DELIMITER $$&lt;br /&gt; &lt;br /&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;DROP&lt;/span&gt; PROCEDURE IF EXISTS &lt;span style=&quot;color: #ff00ff&quot;&gt;`t_girl`&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;`sp_get_article`&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;$&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;CREATE&lt;/span&gt; DEFINER&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;`root`&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;`%`&lt;/span&gt; PROCEDURE &lt;span style=&quot;color: #ff00ff&quot;&gt;`sp_get_article`&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;IN&lt;/span&gt; f_category_id &lt;span style=&quot;color: #ff0000&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&lt;span style=&quot;color: #0000ff&quot;&gt;IN&lt;/span&gt; f_page_size &lt;span style=&quot;color: #ff0000&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;IN&lt;/span&gt; f_page_no &lt;span style=&quot;color: #ff0000&quot;&gt;int&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt;&lt;br /&gt; BEGIN&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;select a.* from article as a inner join &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;concat&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;(select a.aid from article as a &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;if f_category_id &lt;span style=&quot;color: #ff0000&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; 0 &lt;span style=&quot;color: #0000ff&quot;&gt;then&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;concat&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39; inner join (select cid from category where cid = &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;f_category_id&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39; or parent_id = &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;f_category_id&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;) as b on a.category_id = b.cid&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff&quot;&gt;end&lt;/span&gt; if&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;if f_page_size &lt;span style=&quot;color: #0000cc&quot;&gt;&amp;gt;&lt;/span&gt;0 &lt;span style=&quot;color: #0000cc&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;&amp;amp;&lt;/span&gt; f_page_no &lt;span style=&quot;color: #0000cc&quot;&gt;&amp;gt;&lt;/span&gt; 0 &lt;span style=&quot;color: #0000ff&quot;&gt;then&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;concat&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39; limit &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;f_page_no-1&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;*&lt;/span&gt;f_page_size&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;f_page_size&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff&quot;&gt;end&lt;/span&gt; if&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;  &lt;br /&gt; &amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #ff0000&quot;&gt;concat&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;) as b on (a.aid = b.aid)&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;prepare s1 &lt;span style=&quot;color: #0000ff&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;execute s1&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;deallocate prepare s1&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color: #008080&quot;&gt;stmt&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;NULL&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;br /&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;END&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;$&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; DELIMITER &lt;span style=&quot;color: #0000cc&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style=&quot;color: #0001ff&quot;&gt;4）、我们用mysqlslap来测试&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0080ff&quot;&gt;以下得这个例子代表用mysqlslap来测试并发数为25,50,100的调用存储过程，并且总共调用5000次。&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;[&lt;/span&gt;root@localhost &lt;span style=&quot;color: #0000cc&quot;&gt;~&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;#&lt;/span&gt; mysqlslap &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;defaults&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;usr&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;local&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;mysql&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;maria&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;my&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;cnf &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;concurrency&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;25&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;50&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;100 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;iterations&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;1 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;query&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;call t_girl.sp_get_article(2,10,1);&amp;#39;&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;number&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;of&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;queries&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;5000 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;debug&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;info&lt;/span&gt;  &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;uroot &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;p &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;S&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;tmp&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;mysql50&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;sock&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;Enter password: &lt;br /&gt;Benchmark&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of seconds to run all queries: 3.507 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Minimum number of seconds to run all queries: 3.507 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum number of seconds to run all queries: 3.507 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of clients running queries: 25&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of queries per client: 200&lt;br /&gt;&lt;span style=&quot;color: #ff0102&quot;&gt;平均每个并发运行200个查询用了3.507秒。&lt;/span&gt;&lt;br /&gt;Benchmark&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of seconds to run all queries: 3.742 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Minimum number of seconds to run all queries: 3.742 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum number of seconds to run all queries: 3.742 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of clients running queries: 50&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of queries per client: 100&lt;br /&gt;&lt;br /&gt;Benchmark&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of seconds to run all queries: 3.697 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Minimum number of seconds to run all queries: 3.697 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Maximum number of seconds to run all queries: 3.697 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number of clients running queries: 100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Average number of queries per client: 50&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;User time 0.87, System time 0.33&lt;br /&gt;Maximum resident set size 0, Integral resident set size 0&lt;br /&gt;Non-physical pagefaults 1877, Physical pagefaults 0, Swaps 0&lt;br /&gt;Blocks in 0 out 0, Messages in 0 out 0, Signals 0&lt;br /&gt;Voluntary context switches 27218, Involuntary context switches 3100&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0080ff&quot;&gt;看一下SHOW PROCESSLIST 结果&lt;/span&gt;&lt;br /&gt;mysql&amp;gt; show processlist;&lt;br /&gt;+------+------+--------------------+--------------------+---------+-------+--------------------+------------------------------------------------------------------------------------------------------+&lt;br /&gt;| Id&amp;nbsp;&amp;nbsp; | User | Host&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | db&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Command | Time&amp;nbsp; | State&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Info&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+------+------+--------------------+--------------------+---------+-------+--------------------+------------------------------------------------------------------------------------------------------+&lt;br /&gt;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;br /&gt;| 3177 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3178 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3179 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3181 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3180 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3182 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3183 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3187 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | removing tmp table | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3186 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3194 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3203 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | deallocate prepare s1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | &lt;br /&gt;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;br /&gt;| 3221 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3222 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3223 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3224 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | removing tmp table | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3225 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;| 3226 | root | %&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | t_girl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | Query&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 | NULL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | select a.* from article as a inner join (select a.aid from article as a&amp;nbsp; inner join (select cid from | &lt;br /&gt;+------+------+--------------------+--------------------+---------+-------+--------------------+------------------------------------------------------------------------------------------------------+&lt;br /&gt;55 rows in set (0.00 sec)&lt;br /&gt;&lt;br style=&quot;color: #0080ff&quot; /&gt;&lt;span style=&quot;color: #0080ff&quot;&gt;上面的测试语句其实也可以这样写&lt;/span&gt;&lt;br /&gt;&lt;p style=&quot;margin: 5px; line-height: 150%&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: #000000&quot;&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;[&lt;/span&gt;root@localhost &lt;span style=&quot;color: #0000cc&quot;&gt;~&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;#&lt;/span&gt; mysqlslap &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;defaults&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;usr&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;local&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;mysql&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;maria&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;my&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;cnf &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;concurrency&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;25&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;50&lt;span style=&quot;color: #0000cc&quot;&gt;,&lt;/span&gt;100 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;iterations&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;1 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;create&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;schema&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;t_girl&amp;#39;&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;query&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #ff00ff&quot;&gt;&amp;#39;call sp_get_article(2,10,1);&amp;#39;&lt;/span&gt; &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;number&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;of&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;queries&lt;span style=&quot;color: #0000cc&quot;&gt;=&lt;/span&gt;5000 &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;debug&lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000ff&quot;&gt;info&lt;/span&gt;  &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;uroot &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;p &lt;span style=&quot;color: #0000cc&quot;&gt;-&lt;/span&gt;S&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;tmp&lt;span style=&quot;color: #0000cc&quot;&gt;/&lt;/span&gt;mysql50&lt;span style=&quot;color: #0000cc&quot;&gt;.&lt;/span&gt;sock&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style=&quot;color: #009902; font-weight: bold&quot;&gt;小总结一下。&lt;/span&gt;&lt;br style=&quot;color: #009902; font-weight: bold&quot; /&gt;&lt;span style=&quot;color: #009902; font-weight: bold&quot;&gt;mysqlslap对于模拟多个用户同时对MySQL发起&amp;ldquo;进攻&amp;rdquo;提供了方便。同时详细的提供了&amp;ldquo;高负荷攻击MySQL&amp;rdquo;的详细数据报告。&lt;/span&gt;&lt;br style=&quot;color: #009902; font-weight: bold&quot; /&gt;&lt;span style=&quot;color: #009902; font-weight: bold&quot;&gt;而且如果你想对于多个引擎的性能。这个工具再好不过了。&lt;/span&gt;&lt;br style=&quot;color: #009902; font-weight: bold&quot; /&gt;&lt;br /&gt;&amp;nbsp;</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2008-06-15T04:20:39Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/848">
  <title>MySQL Proxy Getting Started</title>
  <link>http://16hot.blog.isyi.com/post/1/848</link>
  <dc:description>What is MySQL Proxy?&lt;br /&gt; &lt;br /&gt; MySQL Proxy is a simple program that sits between your client and MySQL server(s) that can monitor, analyze or transform their communication. Its flexibility allows for unlimited uses; common ones include: load balancing; failover; query analysis; query filtering and modification; and many more. &lt;br /&gt; Commandline Syntax&lt;br /&gt; &lt;br /&gt; To use the MySQL Proxy:[code]$ mysql-proxy --help-all&lt;br /&gt; Usage:&lt;br /&gt; &amp;nbsp;&amp;nbsp;mysql-proxy [OPTION...] - MySQL Proxy&lt;br /&gt; &lt;br /&gt; Help Options:&lt;br /&gt; &amp;nbsp;&amp;nbsp;-?, --help&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Show help options&lt;br /&gt; &amp;nbsp;&amp;nbsp;--help-all&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Show all help options&lt;br /&gt; &amp;nbsp;&amp;nbsp;--help-admin&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; Show options for the admin-module&lt;br /&gt; &amp;nbsp;&amp;nbsp;--help-proxy&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; Show options for the proxy-module&lt;br /&gt; &lt;br /&gt; admin module&lt;br /&gt; &amp;nbsp;&amp;nbsp;--admin-address=&amp;lt;host:port&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; listening address:port of internal admin-server (default: :4041)&lt;br /&gt; &lt;br /&gt; proxy-module&lt;br /&gt; &amp;nbsp;&amp;nbsp;--proxy-address=&amp;lt;host:port&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; listening address:port of the proxy-server (default: :4040)&lt;br /&gt; &amp;nbsp;&amp;nbsp;--proxy-read-only-backend-addresses=&amp;lt;host:port&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;address:port of the remote slave-server (default: not set)&lt;br /&gt; &amp;nbsp;&amp;nbsp;--proxy-backend-addresses=&amp;lt;host:port&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;address:port of the remote backend-servers (default: 127.0.0.1:3306)&lt;br /&gt; &amp;nbsp;&amp;nbsp;--proxy-skip-profiling&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;disables profiling of queries (default: enabled)&lt;br /&gt; &amp;nbsp;&amp;nbsp;--proxy-fix-bug-25371&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; fix bug #25371 (mysqld &amp;gt; 5.1.12) for older libmysql versions&lt;br /&gt; &amp;nbsp;&amp;nbsp;--proxy-lua-script=&amp;lt;file&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;filename of the lua script (default: not set)&lt;br /&gt; &amp;nbsp;&amp;nbsp;--no-proxy&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Don&amp;#39;t start proxy-server&lt;br /&gt; &lt;br /&gt; Application Options:&lt;br /&gt; &amp;nbsp;&amp;nbsp;-V, --version&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Show version&lt;br /&gt; &amp;nbsp;&amp;nbsp;--daemon&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Start in daemon-mode&lt;br /&gt; &amp;nbsp;&amp;nbsp;--pid-file=&amp;lt;file&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;PID file in case we are started as daemon[/code]&lt;br /&gt; &amp;nbsp;&amp;nbsp;Connecting&lt;br /&gt; &lt;br /&gt; As a simple test, just start it and try to connect to port 4040 with your mysql-client. &lt;br /&gt; [code]$ mysql-proxy &amp;amp;&lt;br /&gt;  $ mysql --host=127.0.0.1 --port=4040 --user=... --password[/code]&lt;br /&gt; &amp;nbsp; &amp;nbsp; *&amp;nbsp;&amp;nbsp;The MySQL Proxy will pass the connection through to port 3306 at 127.0.0.1&lt;br /&gt; &amp;nbsp; &amp;nbsp; * IMPORTANT: The MySQL server should be 5.0.x or later. Testing has not been performed with Version 4.1 however feedback is welcome from the community. &lt;br /&gt; &lt;br /&gt; Proxy Module&lt;br /&gt; &lt;br /&gt; The proxy module is split into two parts:&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp; * a core written in C&lt;br /&gt; &amp;nbsp; &amp;nbsp; * a lua interface &lt;br /&gt; &lt;br /&gt; The core handles the basics of packet forwarding tries to be fast and have low latency as possible and handles more than 1000 connections in parallel. Part of the core are:&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp; * config-file handling&lt;br /&gt; &amp;nbsp; &amp;nbsp; * mysql-protocol encoding&lt;br /&gt; &amp;nbsp; &amp;nbsp; * socket handling&lt;br /&gt; &amp;nbsp; &amp;nbsp; * load balancing&lt;br /&gt; &amp;nbsp; &amp;nbsp; * fail over &lt;br /&gt; [code]$ mysql-proxy --help-proxy&lt;br /&gt;  Usage:&lt;br /&gt; &amp;nbsp; &amp;nbsp;mysql-proxy [OPTION...] - MySQL Proxy[/code]&lt;br /&gt; [code]proxy-module&lt;br /&gt; &amp;nbsp; &amp;nbsp;--proxy-address=&amp;lt;ip:port&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;listening address:port of the proxy-server (default: :4040)&lt;br /&gt; &amp;nbsp; &amp;nbsp;--proxy-read-only-address=&amp;lt;ip:port&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;listening address:port of the proxy-server for read-only connection (default: :4042)&lt;br /&gt; &amp;nbsp; &amp;nbsp;--proxy-backend-addresses=&amp;lt;ip:port&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;address:port of the remote backend-servers (default: not set)&lt;br /&gt; &amp;nbsp; &amp;nbsp;--proxy-profiling&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;enable profiling of queries&lt;br /&gt; &amp;nbsp; &amp;nbsp;--proxy-fix-bug-25371&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; fix bug #25371 (mysqld &amp;gt; 5.1.12) for older libmysql versions&lt;br /&gt; &amp;nbsp; &amp;nbsp;--proxy-lua-script=&amp;lt;file&amp;gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;filename of the lua script (default: not set)[/code]&lt;br /&gt; The --proxy-address is the port where mysql connects to get forwarded to one of the backends.&lt;br /&gt; &lt;br /&gt; The backends are announced with --proxy-backend-addresses which defaults to 127.0.0.1:3306. You can specify this option several times to add more backends.&lt;br /&gt; Admin Server&lt;br /&gt; &lt;br /&gt; The admin-server is the most basic implementation of the MySQL server protocol and can respond to some basic queries. It implements:&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp; * socket handling&lt;br /&gt; &amp;nbsp; &amp;nbsp; * the life-cycle of a connection&lt;br /&gt; &amp;nbsp; &amp;nbsp; * mysql wire-protocol&lt;br /&gt; &amp;nbsp; &amp;nbsp; * len-encoding of some fields&lt;br /&gt; &amp;nbsp; &amp;nbsp; * field-types&lt;br /&gt; &amp;nbsp; &amp;nbsp; * result-sets &lt;br /&gt; &lt;br /&gt; While the design is based on the ideas from lighttpd in the way that it is using non-blocking network-io the network-protocol is based on the information available in the internals document from dev.mysql.com&lt;br /&gt; &lt;br /&gt; The admin-servers implements 2 basic queries which are issued by the mysql command-line client: &lt;br /&gt; [code]select @@version_comment LIMIT 1;&lt;br /&gt; select USER();[/code]&lt;br /&gt; Using the admin server you can implement the functionality in a way that every mysql client (php, jdbc, odbc, perl, ...) can execute them.&lt;br /&gt; &lt;br /&gt; We use it to export the current config and to track the open connections: &lt;br /&gt; [code]&amp;gt; select * from proxy_connections;&lt;br /&gt; +------+--------+-------+-------+&lt;br /&gt; | id&amp;nbsp; &amp;nbsp;| type&amp;nbsp; &amp;nbsp;| state | db&amp;nbsp; &amp;nbsp; |&lt;br /&gt; +------+--------+-------+-------+&lt;br /&gt; |&amp;nbsp; &amp;nbsp; 2 | proxy&amp;nbsp;&amp;nbsp;| 8&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;| world |&lt;br /&gt; |&amp;nbsp; &amp;nbsp; 3 | server | 8&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; |&lt;br /&gt; +------+--------+-------+-------+[/code]&lt;br /&gt; and the config:&lt;br /&gt; [code]&amp;gt; select * from proxy_config;&lt;br /&gt; +---------------------------------+----------------+&lt;br /&gt; | option&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;| value&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; |&lt;br /&gt; +---------------------------------+----------------+&lt;br /&gt; | admin.address&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; | :4041&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; |&lt;br /&gt; | proxy.address&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; | :4040&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; |&lt;br /&gt; | proxy.backend_addresses[0]&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;| 127.0.0.1:3306 |&lt;br /&gt; | proxy.backend_addresses[1]&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;| 127.0.0.1:3307 |&lt;br /&gt; | proxy.fix_bug_25371&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; | 0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;br /&gt; | repclient.master_address&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; |&lt;br /&gt; +---------------------------------+----------------+[/code]&lt;br /&gt; &amp;nbsp;&amp;nbsp;Load Balancing &amp;amp; Failover&lt;br /&gt; &lt;br /&gt; How about some load-balancing and fail-over? &lt;br /&gt; [code]$ mysql-proxy &lt;br /&gt; &amp;nbsp; &amp;nbsp; --proxy-backend-addresses=10.0.1.2:3306 &lt;br /&gt; &amp;nbsp; &amp;nbsp; --proxy-backend-addresses=10.0.1.3:3306 &amp;amp;[/code]&lt;br /&gt; Run your tests, shut down one of the backends and see how the MySQL Proxy sends all traffic to the one which is still alive.&lt;br /&gt; Scripting&lt;br /&gt; &lt;br /&gt; MySQL Proxy includes lua script support. Lua is a simple and fast embeddable script language. Tutorial scripts are posted as snippets here; we encourage you to contribute your own! Add new snippets here, and please tag them with mysqlproxy.&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; We use a state-machine which maps the basic stages of the MySQL protocol: &lt;br /&gt; [img]http://forge.mysql.com/w/images/6/6e/Mysql-proto-state.png[/img]&lt;br /&gt; With the lua scripts you can hook into 3 stages right now:&lt;br /&gt; &lt;br /&gt; &amp;nbsp; &amp;nbsp; * connect_server&lt;br /&gt; &amp;nbsp; &amp;nbsp; * read_query&lt;br /&gt; &amp;nbsp; &amp;nbsp; * read_query_result &lt;br /&gt; &lt;br /&gt; If you want to write a load balancer you can hook into connect_server which is called before we connect to a backend server. The load-balancer can pick a backend from a list of backends.&lt;br /&gt; &lt;br /&gt; read_query is the stage where we read the query from the client before we send it to the server. In this stage you can decide if you want to pass the query on as is, rewrite it, inject more queries or respond directly to the client without forwarding the packet to the server.&lt;br /&gt; &lt;br /&gt; For example you can dump all the data which is transfered between client and server (after the authentication stage): &lt;br /&gt; [code] (sqf) taking 127.0.0.1:3306, clients: 0&lt;br /&gt;  .---&amp;nbsp;&amp;nbsp;mysql result packet&lt;br /&gt;  | query.len = 13&lt;br /&gt;  | query.packet = 03 73 68 6f 77 20 65 6e 67 69 6e 65 73&lt;br /&gt;  | .--- query&lt;br /&gt;  | | command = COM_QUERY&lt;br /&gt;  | | query = &amp;quot;show engines&amp;quot;&lt;br /&gt;  | &amp;#39;---&lt;br /&gt;  |&lt;br /&gt;  | result.len = 1&lt;br /&gt;  | result.packet = 06&lt;br /&gt;  | .---&lt;br /&gt;  | | command = COM_QUERY&lt;br /&gt;  | | num-cols = 6&lt;br /&gt;  | | field[0] = { type = 253, name = Engine }&lt;br /&gt;  | | field[1] = { type = 253, name = Support }&lt;br /&gt;  | | field[2] = { type = 253, name = Comment }&lt;br /&gt;  | | field[3] = { type = 253, name = Transactions }&lt;br /&gt;  | | field[4] = { type = 253, name = XA }&lt;br /&gt;  | | field[5] = { type = 253, name = Savepoints }&lt;br /&gt;  | | row[0] = { ndbcluster, DISABLED, Clustered, fault-tolerant tables, YES, NO, NO }&lt;br /&gt;  | | row[1] = { MRG_MYISAM, YES, Collection of identical MyISAM tables, NO, NO, NO }&lt;br /&gt;  | | row[2] = { BLACKHOLE, YES, /dev/null storage engine (anything you write to it disappears), NO, NO, NO }&lt;br /&gt;  | | row[3] = { CSV, YES, CSV storage engine, NO, NO, NO }&lt;br /&gt;  | | row[4] = { MEMORY, YES, Hash based, stored in memory, useful for temporary tables, NO, NO, NO }&lt;br /&gt;  | | row[5] = { FEDERATED, YES, Federated MySQL storage engine, YES, NO, NO }&lt;br /&gt;  | | row[6] = { ARCHIVE, YES, Archive storage engine, NO, NO, NO }&lt;br /&gt;  | | row[7] = { InnoDB, YES, Supports transactions, row-level locking, and foreign keys, YES, YES, YES }&lt;br /&gt;  | | row[8] = { MyISAM, DEFAULT, Default engine as of MySQL 3.23 with great performance, NO, NO, NO }&lt;br /&gt;  | &amp;#39;---&lt;br /&gt;  &amp;#39;---[/code]</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2008-06-11T05:38:47Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/847">
  <title>mysql-proxy 按表分发查询的lua脚本</title>
  <link>http://16hot.blog.isyi.com/post/1/847</link>
  <dc:description>&lt;p&gt;请修改这里：注意，本版本尚未经过严格测试与实际检验！！发出来只为提供一种思路，使用时请根据实际情况修改，风险自担。&lt;br /&gt; --  将分到另一个库中的表明列在这里：&lt;br /&gt; local remote_tables = {&amp;quot;table1&amp;quot;, &amp;quot;table2&amp;quot;}&lt;/p&gt; &lt;p&gt;在启动的时候： &lt;/p&gt; &lt;pre&gt;mysql-proxy &lt;br /&gt;    --proxy-backend-addresses=10.0.0.2:3306 &lt;br /&gt;    --proxy-backend-addresses=10.0.0.3:3306 &lt;br /&gt;    --proxy-lua-script=./mysql_proxy_store.lua&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; lua脚本：&lt;/p&gt; &lt;pre&gt;-- mysql_proxy_store.lua&lt;br /&gt;-- for mercury&lt;br /&gt;-- author: Albert Lee&lt;br /&gt;--&lt;br /&gt;-- for billions samples store requirement, we split the samples &amp;amp; store table &lt;br /&gt;--&lt;br /&gt;--[[&lt;br /&gt; &lt;br /&gt;   Copyright (C) 2007 MySQL AB&lt;br /&gt; &lt;br /&gt;   This program is free software; you can redistribute it and/or modify&lt;br /&gt;   it under the terms of the GNU General Public License as published by&lt;br /&gt;   the Free Software Foundation; version 2 of the License.&lt;br /&gt; &lt;br /&gt;   This program is distributed in the hope that it will be useful,&lt;br /&gt;   but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;   GNU General Public License for more details.&lt;br /&gt; &lt;br /&gt;   You should have received a copy of the GNU General Public License&lt;br /&gt;   along with this program; if not, write to the Free Software&lt;br /&gt;   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA&lt;br /&gt; &lt;br /&gt;--]]&lt;br /&gt; &lt;br /&gt;---&lt;br /&gt;-- a flexible statement based load balancer with connection pooling&lt;br /&gt;--&lt;br /&gt;-- * build a connection pool of min_idle_connections for each backend and &lt;br /&gt;--   maintain its size&lt;br /&gt;-- * reusing a server-side connection when it is idling&lt;br /&gt;-- &lt;br /&gt; &lt;br /&gt;--- config&lt;br /&gt;--&lt;br /&gt;--  将分到另一个库中的表明列在这里：&lt;br /&gt;local remote_tables = {&amp;quot;table1&amp;quot;, &amp;quot;table2&amp;quot;}&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;local min_idle_connections = 1&lt;br /&gt;local max_idle_connections = 2&lt;br /&gt; &lt;br /&gt;-- debug&lt;br /&gt;local is_debug = true&lt;br /&gt; &lt;br /&gt;--- end of config&lt;br /&gt; &lt;br /&gt;---&lt;br /&gt;-- read/write splitting sends all non-transactional SELECTs to the slaves&lt;br /&gt;--&lt;br /&gt;-- is_in_transaction tracks the state of the transactions&lt;br /&gt;local is_in_transaction = 0&lt;br /&gt; &lt;br /&gt;--- &lt;br /&gt;-- get a connection to a backend&lt;br /&gt;--&lt;br /&gt;-- as long as we don&amp;#39;t have enough connections in the pool, create new connections&lt;br /&gt;--&lt;br /&gt;function connect_server() &lt;br /&gt;        -- make sure that we connect to each backend at least ones to &lt;br /&gt;        -- keep the connections to the servers alive&lt;br /&gt;        --&lt;br /&gt;        -- on read_query we can switch the backends again to another backend&lt;br /&gt; &lt;br /&gt;        if is_debug then&lt;br /&gt;                print()&lt;br /&gt;                print(&amp;quot;[connect_server] &amp;quot;)&lt;br /&gt;        end&lt;br /&gt; &lt;br /&gt;        local least_idle_conns_ndx = 0&lt;br /&gt;        local least_idle_conns = 0&lt;br /&gt; &lt;br /&gt;        for i = 1, #proxy.backends do&lt;br /&gt;                local s = proxy.backends[i]&lt;br /&gt;                local pool     = s.pool -- we don&amp;#39;t have a username yet, try to find a connections which is idling&lt;br /&gt;                local cur_idle = pool.users[&amp;quot;&amp;quot;].cur_idle_connections&lt;br /&gt; &lt;br /&gt;                if is_debug then&lt;br /&gt;                        print(&amp;quot;  [&amp;quot;.. i ..&amp;quot;].connected_clients = &amp;quot; .. s.connected_clients)&lt;br /&gt;                        print(&amp;quot;  [&amp;quot;.. i ..&amp;quot;].idling_connections = &amp;quot; .. cur_idle)&lt;br /&gt;                        print(&amp;quot;  [&amp;quot;.. i ..&amp;quot;].type = &amp;quot; .. s.type)&lt;br /&gt;                        print(&amp;quot;  [&amp;quot;.. i ..&amp;quot;].state = &amp;quot; .. s.state)&lt;br /&gt;                end&lt;br /&gt; &lt;br /&gt;                if s.state ~= proxy.BACKEND_STATE_DOWN then&lt;br /&gt;                        -- try to connect to each backend once at least&lt;br /&gt;                        if cur_idle == 0 then&lt;br /&gt;                                proxy.connection.backend_ndx = i&lt;br /&gt;                                if is_debug then&lt;br /&gt;                                        print(&amp;quot;  [&amp;quot;.. i ..&amp;quot;] open new connection&amp;quot;)&lt;br /&gt;                                end&lt;br /&gt;                                return&lt;br /&gt;                        end&lt;br /&gt; &lt;br /&gt;                        -- try to open at least min_idle_connections&lt;br /&gt;                        if least_idle_conns_ndx == 0 or&lt;br /&gt;                           ( cur_idle &amp;lt; min_idle_connections and &lt;br /&gt;                             cur_idle &amp;lt; least_idle_conns ) then&lt;br /&gt;                                least_idle_conns_ndx = i&lt;br /&gt;                                least_idle_conns = s.idling_connections&lt;br /&gt;                        end&lt;br /&gt;                end&lt;br /&gt;        end&lt;br /&gt; &lt;br /&gt;        if least_idle_conns_ndx &amp;gt; 0 then&lt;br /&gt;                proxy.connection.backend_ndx = least_idle_conns_ndx&lt;br /&gt;        end&lt;br /&gt; &lt;br /&gt;        if proxy.connection.backend_ndx &amp;gt; 0 then &lt;br /&gt;                local s = proxy.backends[proxy.connection.backend_ndx]&lt;br /&gt;                local pool     = s.pool -- we don&amp;#39;t have a username yet, try to find a connections which is idling&lt;br /&gt;                local cur_idle = pool.users[&amp;quot;&amp;quot;].cur_idle_connections&lt;br /&gt; &lt;br /&gt;                if cur_idle &amp;gt;= min_idle_connections then&lt;br /&gt;                        -- we have 4 idling connections in the pool, that&amp;#39;s good enough&lt;br /&gt;                        if true or is_debug then&lt;br /&gt;                                print(&amp;quot;  using pooled connection from: &amp;quot; .. proxy.connection.backend_ndx)&lt;br /&gt;                        end&lt;br /&gt; &lt;br /&gt;                        return proxy.PROXY_IGNORE_RESULT&lt;br /&gt;                end&lt;br /&gt;        end&lt;br /&gt; &lt;br /&gt;        if is_debug then&lt;br /&gt;                print(&amp;quot;  opening new connection on: &amp;quot; .. proxy.connection.backend_ndx)&lt;br /&gt;        end&lt;br /&gt; &lt;br /&gt;        -- open a new connection &lt;br /&gt;end&lt;br /&gt; &lt;br /&gt;--- &lt;br /&gt;-- put the successfully authed connection into the connection pool&lt;br /&gt;--&lt;br /&gt;-- @param auth the context information for the auth&lt;br /&gt;--&lt;br /&gt;-- auth.packet is the packet&lt;br /&gt;function read_auth_result( auth )&lt;br /&gt;        if auth.packet:byte() == proxy.MYSQLD_PACKET_OK then&lt;br /&gt;                -- auth was fine, disconnect from the server&lt;br /&gt;                proxy.connection.backend_ndx = 0&lt;br /&gt;        elseif auth.packet:byte() == proxy.MYSQLD_PACKET_EOF then&lt;br /&gt;                -- we received either a &lt;br /&gt;                -- &lt;br /&gt;                -- * MYSQLD_PACKET_ERR and the auth failed or&lt;br /&gt;                -- * MYSQLD_PACKET_EOF which means a OLD PASSWORD (4.0) was sent&lt;br /&gt;                print(&amp;quot;(read_auth_result) ... not ok yet&amp;quot;);&lt;br /&gt;        elseif auth.packet:byte() == proxy.MYSQLD_PACKET_ERR then&lt;br /&gt;                -- auth failed&lt;br /&gt;        end&lt;br /&gt;end&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;--- &lt;br /&gt;-- read/write splitting&lt;br /&gt;function read_query( packet ) &lt;br /&gt;        if is_debug then&lt;br /&gt;                print(&amp;quot;[read_query]&amp;quot;)&lt;br /&gt;                print(&amp;quot;  authed backend = &amp;quot; .. proxy.connection.backend_ndx)&lt;br /&gt;                print(&amp;quot;  used db = &amp;quot; .. proxy.connection.client.default_db)&lt;br /&gt;        end&lt;br /&gt; &lt;br /&gt;        if packet:byte() == proxy.COM_QUIT then&lt;br /&gt;                -- don&amp;#39;t send COM_QUIT to the backend. We manage the connection&lt;br /&gt;                -- in all aspects.&lt;br /&gt;                proxy.response = {&lt;br /&gt;                        type = proxy.MYSQLD_PACKET_OK,&lt;br /&gt;                }&lt;br /&gt; &lt;br /&gt;                return proxy.PROXY_SEND_RESULT&lt;br /&gt;        end&lt;br /&gt; &lt;br /&gt;        if proxy.connection.backend_ndx == 0 then&lt;br /&gt;                -- we don&amp;#39;t have a backend right now&lt;br /&gt;                -- &lt;br /&gt;                -- let&amp;#39;s pick a master as a good default&lt;br /&gt; &lt;br /&gt;                query = string.sub(packet, 2)&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;                for i = 1, #remote_tables do&lt;br /&gt;                        print (i, remote_tables[i])&lt;br /&gt;                        if string.find(query, remote_tables[i]) then&lt;br /&gt;                                proxy.connection.backend_ndx = 2&lt;br /&gt;                                break&lt;br /&gt;                        end&lt;br /&gt;                        proxy.connection.backend_ndx = 1&lt;br /&gt;                end&lt;br /&gt; &lt;br /&gt;                -- if string.find(query, &amp;quot;auth_group&amp;quot;) then&lt;br /&gt;                --      print(&amp;quot;Use Another Database&amp;quot;)&lt;br /&gt;                --      proxy.connection.backend_ndx = 2&lt;br /&gt;                -- else&lt;br /&gt;                --        print(&amp;quot;Use local database&amp;quot;)&lt;br /&gt;                --      proxy.connection.backend_ndx = 1&lt;br /&gt;                -- end&lt;br /&gt; &lt;br /&gt;        end&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;        proxy.queries:append(1, packet)&lt;br /&gt; &lt;br /&gt;        return proxy.PROXY_SEND_QUERY&lt;br /&gt;end&lt;br /&gt; &lt;br /&gt;---&lt;br /&gt;-- as long as we are in a transaction keep the connection&lt;br /&gt;-- otherwise release it so another client can use it&lt;br /&gt;function read_query_result( inj ) &lt;br /&gt;        local res      = assert(inj.resultset)&lt;br /&gt;        local flags    = res.flags&lt;br /&gt; &lt;br /&gt;        if inj.id ~= 1 then&lt;br /&gt;                -- ignore the result of the USE &lt;br /&gt;                return proxy.PROXY_IGNORE_RESULT&lt;br /&gt;        end&lt;br /&gt;        is_in_transaction = flags.in_trans&lt;br /&gt; &lt;br /&gt;        if not is_in_transaction then&lt;br /&gt;                -- release the backend&lt;br /&gt;                proxy.connection.backend_ndx = 0&lt;br /&gt;        end&lt;br /&gt;end&lt;br /&gt; &lt;br /&gt;--- &lt;br /&gt;-- close the connections if we have enough connections in the pool&lt;br /&gt;--&lt;br /&gt;-- @return nil - close connection &lt;br /&gt;--         IGNORE_RESULT - store connection in the pool&lt;br /&gt;function disconnect_client()&lt;br /&gt;        if is_debug then&lt;br /&gt;                print(&amp;quot;[disconnect_client]&amp;quot;)&lt;br /&gt;        end&lt;br /&gt; &lt;br /&gt;        if proxy.connection.backend_ndx == 0 then&lt;br /&gt;                -- currently we don&amp;#39;t have a server backend assigned&lt;br /&gt;                --&lt;br /&gt;                -- pick a server which has too many idling connections and close one&lt;br /&gt;                for i = 1, #proxy.backends do&lt;br /&gt;                        local s = proxy.backends[i]&lt;br /&gt;                        local pool     = s.pool -- we don&amp;#39;t have a username yet, try to find a connections which is idling&lt;br /&gt;                        local cur_idle = pool.users[proxy.connection.client.username].cur_idle_connections&lt;br /&gt; &lt;br /&gt;                        if s.state ~= proxy.BACKEND_STATE_DOWN and&lt;br /&gt;                           cur_idle &amp;gt; max_idle_connections then&lt;br /&gt;                                -- try to disconnect a backend&lt;br /&gt;                                proxy.connection.backend_ndx = i&lt;br /&gt;                                if is_debug then&lt;br /&gt;                                        print(&amp;quot;  [&amp;quot;.. i ..&amp;quot;] closing connection, idling: &amp;quot; .. cur_idle)&lt;br /&gt;                                end&lt;br /&gt;                                return&lt;br /&gt;                        end&lt;br /&gt;                end&lt;br /&gt;        end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2008-06-11T05:36:12Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/846">
  <title>MySQL Proxy learns R/W Splitting</title>
  <link>http://16hot.blog.isyi.com/post/1/846</link>
  <dc:description>&lt;div class=&quot;entrybody&quot;&gt; 	   	    &lt;p&gt;The trunk version of the MySQL Proxy 0.6.0 just learnt about changing backends within running connection. It is now up to lua-script to decide which backend shall be used to send requests too.&lt;/p&gt;  &lt;p&gt;We wrote a complete &lt;a href=&quot;http://svn.mysql.com/svnpublic/mysql-proxy/trunk/examples/tutorial-keepalive.lua&quot;&gt;tutorial&lt;/a&gt; which covers everything from:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;building and maintaining a connection pool with high and low water marks&lt;/li&gt;&lt;li&gt;transparent authentication (no extra auth against the proxy)&lt;/li&gt;&lt;li&gt;deciding on Query Level which backend to use&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;and implement a transparent read/write splitter which sends all non-transactional Queries to the slaves and the rest to the master.&lt;/p&gt;  &lt;p&gt;&lt;img src=&quot;http://jan.kneschke.de/projects/mysql/mysql-proxy-types-trx-splitting.png&quot; border=&quot;0&quot; alt=&quot;R/W Splitting&quot; /&gt;&lt;/p&gt;  &lt;p&gt;As the splitting is in the hands of the lua-scripting level you can use the same to implement sharding or other rules to route traffic on statement level.&lt;/p&gt; 	     		 		 		  &lt;h2&gt;Connection Pooling&lt;/h2&gt;  &lt;p&gt;For R/W Splitting we need a connection pooling. We only switch to another backend if we already have a authenticated connection open to that backend. &lt;/p&gt;  &lt;p&gt;The MySQL protocol first does a challenge-response handshake. When we enter the query/result stage it is too late to authenticate new connections. We have to make sure that we have enough open connections to operate nicely.&lt;/p&gt;  &lt;p&gt;&lt;img src=&quot;http://forge.mysql.com/w/images/6/6e/Mysql-proto-state.png&quot; border=&quot;0&quot; alt=&quot;MySQL Protocol States&quot; /&gt;&lt;/p&gt;  &lt;p&gt;In the &lt;a href=&quot;http://svn.mysql.com/svnpublic/mysql-proxy/trunk/examples/tutorial-keepalive.lua&quot;&gt;keepalive tutorial&lt;/a&gt; we spend quite some code on connection management. The whole connect_servers() function is only to create new connections for all pools.&lt;/p&gt;  &lt;ol&gt;&lt;li&gt;create one connection to each backend&lt;/li&gt;&lt;li&gt;create new connections until we reach min-idle-connections&lt;/li&gt;&lt;li&gt;if the two above conditions are met, use a connection from the pool&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;Let&amp;#39;s take a glimpse at the code:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;--- config&lt;br /&gt;--&lt;br /&gt;-- connection pool&lt;br /&gt;local min_idle_connections = 4&lt;br /&gt;local max_idle_connections = 8&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;-- get a connection to a backend&lt;br /&gt;--&lt;br /&gt;-- as long as we don&amp;#39;t have enough connections in the pool, create new connections&lt;br /&gt;--&lt;br /&gt;function connect_server()&lt;br /&gt;  -- make sure that we connect to each backend at least ones to&lt;br /&gt;  -- keep the connections to the servers alive&lt;br /&gt;  --&lt;br /&gt;  -- on read_query we can switch the backends again to another backend&lt;br /&gt;&lt;br /&gt;  local least_idle_conns_ndx = 0&lt;br /&gt;  local least_idle_conns = 0&lt;br /&gt;&lt;br /&gt;  for i = 1, #proxy.servers do&lt;br /&gt;    local s = proxy.servers[i]&lt;br /&gt;&lt;br /&gt;    if s.state ~= proxy.BACKEND_STATE_DOWN then&lt;br /&gt;      -- try to connect to each backend once at least&lt;br /&gt;      if s.idling_connections == 0 then&lt;br /&gt;        proxy.connection.backend_ndx = i&lt;br /&gt;        return&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      -- try to open at least min_idle_connections&lt;br /&gt;      if least_idle_conns_ndx == 0 or&lt;br /&gt;         ( s.idling_connections &amp;lt; min_idle_connections and&lt;br /&gt;           s.idling_connections &amp;lt; least_idle_conns ) then&lt;br /&gt;        least_idle_conns_ndx = i&lt;br /&gt;        least_idle_conns = s.idling_connections&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  if least_idle_conns_ndx &amp;gt; 0 then&lt;br /&gt;    proxy.connection.backend_ndx = least_idle_conns_ndx&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  if proxy.connection.backend_ndx &amp;gt; 0 and&lt;br /&gt;     proxy.servers[proxy.connection.backend_ndx].idling_connections &amp;gt;= min_idle_connections then&lt;br /&gt;    -- we have 4 idling connections in the pool, that&amp;#39;s good enough&lt;br /&gt;&lt;br /&gt;    return proxy.PROXY_IGNORE_RESULT&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  -- open a new connection&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;The real trick is in&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;---&lt;br /&gt;-- put the authed connection into the connection pool&lt;br /&gt;function read_auth_result(packet)&lt;br /&gt;  -- disconnect from the server&lt;br /&gt;  proxy.connection.backend_ndx = 0&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;The proxy.connection.backend_ndx = 0 we disconnect us from the current backend (lua starts indexing at index 1, 0 is out of bounds). If a second connection comes in now it can use this authed connection too as it is in the pool, idling.&lt;/p&gt;  &lt;p&gt;By setting &lt;code&gt;proxy.connection.backend_ndx&lt;/code&gt; you control which backend is used to send your packets too. A backend is defined as a entry of the &lt;code&gt;proxy.servers&lt;/code&gt; table. Each connection has (zero or) one backend. The backends all have a address, a type (RW or RO) and a state (UP or DOWN).&lt;/p&gt;  &lt;p&gt;As we also might have to many open connections in the pool we close them on shutdown again if necessary:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;---&lt;br /&gt;-- close the connections if we have enough connections in the pool&lt;br /&gt;--&lt;br /&gt;-- @return nil - close connection&lt;br /&gt;--         IGNORE_RESULT - store connection in the pool&lt;br /&gt;function disconnect_client()&lt;br /&gt;  if proxy.connection.backend_ndx == 0 then&lt;br /&gt;    -- currently we don&amp;#39;t have a server backend assigned&lt;br /&gt;    --&lt;br /&gt;    -- pick a server which has too many idling connections and close one&lt;br /&gt;    for i = 1, #proxy.servers do&lt;br /&gt;      local s = proxy.servers[i]&lt;br /&gt;&lt;br /&gt;      if s.state ~= proxy.BACKEND_STATE_DOWN and&lt;br /&gt;         s.idling_connections &amp;gt; max_idle_connections then&lt;br /&gt;        -- try to disconnect a backend&lt;br /&gt;        proxy.connection.backend_ndx = i&lt;br /&gt;        return&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;We only search for a backend which has to many open idling connections and use it before we enter the default behaviour of disconnect_client: shutdown the server connection. &lt;code&gt;if proxy.connection.backend_ndx == 0 then&lt;/code&gt; is the &amp;quot;we don&amp;#39;t have backend associated right now&amp;quot;. We already saw this in &lt;code&gt;read_auth_result&lt;/code&gt;.&lt;/p&gt;  &lt;h2&gt;Read/Write Splitting&lt;/h2&gt;  &lt;p&gt;That is our maintainance of the pool. &lt;code&gt;connect_server()&lt;/code&gt; adds new auth&amp;#39;ed connections to the pool, &lt;code&gt;disconnect_client()&lt;/code&gt; closes them again. The read/write splitting is part of the query/result cycle:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;-- read/write splitting&lt;br /&gt;function read_query( packet )&lt;br /&gt;  if packet:byte() == proxy.COM_QUIT then&lt;br /&gt;    -- don&amp;#39;t send COM_QUIT to the backend. We manage the connection&lt;br /&gt;    -- in all aspects.&lt;br /&gt;    proxy.response = {&lt;br /&gt;      type = proxy.MYSQLD_PACKET_ERR,&lt;br /&gt;      errmsg = &amp;quot;ignored the COM_QUIT&amp;quot;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return proxy.PROXY_SEND_RESULT&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  -- as we switch between different connenctions we have to make sure that&lt;br /&gt;  -- we use always the same DB&lt;br /&gt;  if packet:byte() == proxy.COM_INIT_DB then&lt;br /&gt;    -- default_db is connection global&lt;br /&gt;    default_db = packet:sub(2)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  if proxy.connection.backend_ndx == 0 then&lt;br /&gt;    -- we don&amp;#39;t have a backend right now&lt;br /&gt;    --&lt;br /&gt;    -- let&amp;#39;s pick a master as a good default&lt;br /&gt;    for i = 1, #proxy.servers do&lt;br /&gt;      local s = proxy.servers[i]&lt;br /&gt;&lt;br /&gt;      if s.idling_connections &amp;gt; 0 and&lt;br /&gt;         s.state ~= proxy.BACKEND_STATE_DOWN and&lt;br /&gt;         s.type == proxy.BACKEND_TYPE_RW then&lt;br /&gt;        proxy.connection.backend_ndx = i&lt;br /&gt;        break&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  if packet:byte() == proxy.COM_QUERY and default_db then&lt;br /&gt;    -- how can I know the db of the server connection ?&lt;br /&gt;    proxy.queries:append(2, string.char(proxy.COM_INIT_DB) .. default_db)&lt;br /&gt;  end&lt;br /&gt;  proxy.queries:append(1, packet)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;Up to now it is only making sure that we behave nicely:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;don&amp;#39;t forward &lt;code&gt;COM_QUIT&lt;/code&gt; to the backend as he will close the connection on us&lt;/li&gt;&lt;li&gt;intercept the &lt;code&gt;COM_INIT_DB&lt;/code&gt; to know which DB the client wants to work on. If we switch to another backend we have to make sure the same DB is used.&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;The read/write splitting is now following a simple rule:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;send all non-transactional SELECTs to a slave&lt;/li&gt;&lt;li&gt;everything else goes to the master&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;We are still in &lt;code&gt;read_query()&lt;/code&gt;&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;  -- read/write splitting&lt;br /&gt;  --&lt;br /&gt;  -- send all non-transactional SELECTs to a slave&lt;br /&gt;  if is_in_transaction == 0 and&lt;br /&gt;     packet:byte() == proxy.COM_QUERY and&lt;br /&gt;     packet:sub(2, 7) == &amp;quot;SELECT&amp;quot; then&lt;br /&gt;    local max_conns = -1&lt;br /&gt;    local max_conns_ndx = 0&lt;br /&gt;&lt;br /&gt;    for i = 1, #proxy.servers do&lt;br /&gt;      local s = proxy.servers[i]&lt;br /&gt;&lt;br /&gt;      -- pick a slave which has some idling connections&lt;br /&gt;      if s.type == proxy.BACKEND_TYPE_RO and&lt;br /&gt;         s.idling_connections &amp;gt; 0 then&lt;br /&gt;        if max_conns == -1 or&lt;br /&gt;           s.connected_clients &amp;lt; max_conns then&lt;br /&gt;          max_conns = s.connected_clients&lt;br /&gt;          max_conns_ndx = i&lt;br /&gt;        end&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    -- we found a slave which has a idling connection&lt;br /&gt;    if max_conns_ndx &amp;gt; 0 then&lt;br /&gt;      proxy.connection.backend_ndx = max_conns_ndx&lt;br /&gt;    end&lt;br /&gt;  else&lt;br /&gt;    -- send to master&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  return proxy.PROXY_SEND_QUERY&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;If we found a slave host which has a idling connection we pick it. If all slaves are busy or down, we just send the query to the master.&lt;/p&gt;  &lt;p&gt;As soon as we don&amp;#39;t need this connection anymore give it backend to the pool:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;---&lt;br /&gt;-- as long as we are in a transaction keep the connection&lt;br /&gt;-- otherwise release it so another client can use it&lt;br /&gt;function read_query_result( inj )&lt;br /&gt;  local res      = assert(inj.resultset)&lt;br /&gt;  local flags    = res.flags&lt;br /&gt;&lt;br /&gt;  if inj.id ~= 1 then&lt;br /&gt;    -- ignore the result of the USE &amp;lt;default_db&amp;gt;&lt;br /&gt;    return proxy.PROXY_IGNORE_RESULT&lt;br /&gt;  end&lt;br /&gt;  is_in_transaction = flags.in_trans&lt;br /&gt;&lt;br /&gt;  if is_in_transaction == 0 then&lt;br /&gt;    -- release the backend&lt;br /&gt;    proxy.connection.backend_ndx = 0&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;The MySQL Protocol is nice and offers us a in-transaction-flag. This operates on the state of the transaction and works across all engines. If you want to make sure that several statements go to the same backend, open a transaction with BEGIN. No matter which storage engine you use.&lt;/p&gt;  &lt;h3&gt;Possible extensions&lt;/h3&gt;  &lt;p&gt;While we are here in this section of the code think about another use case:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;if the master is down, ban all writing queries and only allow reading selects against the slaves. &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;It keeps your site up and running even if your master is gone. You only have to handle errors on write-statements and transactions.&lt;/p&gt;  &lt;h3&gt;Known Problems&lt;/h3&gt;  &lt;p&gt;We might have a race-condition that idling connection closes before we can use it. In that case we are in trouble right now and will close the connection to the client. &lt;/p&gt;  &lt;p&gt;We have to add queuing of connections and awaking them up when the connection becomes available again to handle this later.&lt;/p&gt;  &lt;h2&gt;Next Steps&lt;/h2&gt;  &lt;p&gt;Testing, testing, testing. &lt;/p&gt;  &lt;pre&gt;&lt;code&gt;$ mysql-proxy &lt;br /&gt;    --proxy-backend-addresses=10.0.0.1:3306 &lt;br /&gt;    --proxy-read-only-backend-addresses=10.0.0.10:3306 &lt;br /&gt;    --proxy-read-only-backend-addresses=10.0.0.12:3306 &lt;br /&gt;    --proxy-lua-script=examples/tutorial-keepalive.lua&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;The above code works for my tests, but I don&amp;#39;t have any real load. Nor can I create all the error-cases you have in your real-life setups. Please send all your comments, concerns and ideas to the &lt;a href=&quot;http://forums.mysql.com/list.php?146&quot;&gt;MySQL Proxy forum&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Another upcoming step is externalizing all the load-balancer code and move it into modules to make the code easier to understand and reuseable.&lt;/p&gt; 		 	&lt;/div&gt;</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2008-06-11T05:33:02Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/845">
  <title>发现新玩艺儿—-MySQL Proxy(转)</title>
  <link>http://16hot.blog.isyi.com/post/1/845</link>
  <dc:description>&lt;div class=&quot;entry-content&quot;&gt; &lt;p&gt;今天看到了这么一个新项目&amp;ndash;&lt;a href=&quot;http://forge.mysql.com/wiki/MySQL_Proxy&quot;&gt;MySQL Proxy&lt;/a&gt;， 貌似最近比较热门。简单来说就是一个从MySQL Client到Server的一个代理。可能有人认为MySQL这种连接方式不应该会用到代理，因为一般来说都喜欢把MySQL Server放到后端，用内网圈起来，这样一方面保证安全，另一方面用Local&amp;nbsp; Ethernet来避免不稳定因素较多的Internet连接，因此基本没有代理这个角色出现的机会。然而，假如这个代理不仅仅是一个代理，而是一个能 &amp;ldquo;懂得&amp;rdquo;连接双方传送内容，并有可能会对双方内容加以控制甚至干涉的一个角色呢？还有没有人觉得他没用？联想一下&lt;a href=&quot;http://www.squid-cache.org/&quot;&gt;Squid&lt;/a&gt;之于HTTP Client和HTTP Server所能起到的作用，是不是能想到更多了呢？&lt;/p&gt; &lt;p&gt;是的，MySQL Proxy就是这么一个玩艺儿。代理仅仅是其最不值一提的功能，让人激动的功能都是建立在代理这个前提之上，能实现的更好玩的东西，例如以下：&lt;/p&gt; &lt;p&gt;Query Interception&lt;/p&gt; &lt;p&gt;Query Filtering&lt;/p&gt; &lt;p&gt;Query Rewriting&lt;/p&gt; &lt;p&gt;Macro Expansion&lt;/p&gt; &lt;p&gt;可能对于没接触过这个东西的人，这几个概念还不是十分直观，那么这样，在脑子里描绘这样一幅情景：&lt;/p&gt; &lt;p&gt;1，原本为Cilent-Server直连这种拓扑，现在引入MySQL Proxy，变成Client-Proxy-Server。&lt;/p&gt; &lt;p&gt;2，原本为了实现高容载能力，对于Server采取了多台并存，Master/Slave甚至是Master/Master等方式的复制集群，配置管理都比较复杂。而引入了Proxy以后，中间存在了这样一个Store-Forward的proxy环节。&lt;/p&gt; &lt;p&gt;3，在这个环节，我们可以通过一种脚本语言来控制这个proxy的行为，例如对于Client进来的查询依照某种条件过滤，甚至依照某种条件改写，再导向后端的Server。&lt;/p&gt; &lt;p&gt;4，凭借自己实现的filtering或rewriting，我们可以实现很多目的，例如Failover，例如Load balance。或者更无聊些我们可以对Client进来的带有弱智语法错误的SQL语句进行修正。&lt;/p&gt; &lt;p&gt;有了这个东西，几乎是想到什么就能完成什么，这可是大大得扩展了MySQL应用的多样性，可以用它来实现一些高端商业数据库的复杂的企业化功能。相信喜欢MySQL的架构设计师们一定会喜欢这个玩艺儿。&lt;/p&gt; &lt;p&gt;这里有篇&lt;a href=&quot;http://www.oreillynet.com/pub/a/databases/2007/07/12/getting-started-with-mysql-proxy.html?page=1&quot;&gt;Getting Start&lt;/a&gt;，是很好的入门教材，对于这套软件，定要保持关注。&lt;/p&gt;  									&lt;/div&gt;</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2008-06-11T05:30:46Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/810">
  <title>为你的MySQL数据库加铸23道安全门</title>
  <link>http://16hot.blog.isyi.com/post/1/810</link>
  <dc:description>转自cu:http://linux.chinaunix.net/docs/2007-04-02/4101.shtml&lt;br /&gt; &lt;br /&gt; 使用MySQL，安全问题不能不注意。以下是MySQL提示的23个注意事项： &lt;p&gt;　　1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络，那么就需要使用SSH隧道来加密该连接的通信。&lt;/p&gt; &lt;p&gt;　　2.用set password语句来修改用户的密码，三个步骤，先&amp;ldquo;mysql -u root&amp;rdquo;登陆数据库系统，然后&amp;ldquo;mysql&amp;gt; update mysql.user set password=password(&amp;#39;newpwd&amp;#39;)&amp;rdquo;，最后执行&amp;ldquo;flush privileges&amp;rdquo;就可以了。&lt;/p&gt; &lt;p&gt;　　3.需要提防的攻击有，防偷听、篡改、回放、拒绝服务等，不涉及可用性和容错方面。对所有的连接、查询、其他操作使用基于ACL即访问控制列表的安全措施来完成。也有一些对SSL连接的支持。&lt;/p&gt; &lt;p&gt;　　4.除了root用户外的其他任何用户不允许访问mysql主数据库中的user表;&lt;/p&gt; &lt;p&gt;　　加密后存放在user表中的加密后的用户密码一旦泄露，其他人可以随意用该用户名/密码相应的数据库;&lt;/p&gt; &lt;p&gt;　　5.用grant和revoke语句来进行用户访问控制的工作;&lt;/p&gt; &lt;p&gt;　　6.不使用明文密码，而是使用md5()和sha1()等单向的哈系函数来设置密码;&lt;/p&gt; &lt;p&gt;　　7.不选用字典中的字来做密码;&lt;/p&gt; &lt;p&gt;　　8.采用防火墙来去掉50%的外部危险，让数据库系统躲在防火墙后面工作，或放置在DMZ区域中;&lt;/p&gt; &lt;p&gt;　　9.从因特网上用nmap来扫描3306端口，也可用telnet server_host 3306的方法测试，不能允许从非信任网络中访问数据库服务器的3306号TCP端口，因此需要在防火墙或路由器上做设定;&lt;/p&gt; &lt;p&gt;　　10.为了防止被恶意传入非法参数，例如where ID=234，别人却输入where ID=234 OR 1=1导致全部显示，所以在web的表单中使用&amp;#39;&amp;#39;或&amp;quot;&amp;quot;来用字符串，在动态URL中加入%22代表双引号、%23代表井号、%27代表单引号;传递未检 查过的值给mysql数据库是非常危险的;&lt;/p&gt; &lt;p&gt;　　11.在传递数据给mysql时检查一下大小;&lt;/p&gt; &lt;p&gt;　　12.应用程序需要连接到数据库应该使用一般的用户帐号，只开放少数必要的权限给该用户;&lt;/p&gt; &lt;p&gt;　　13.在各编程接口(C C++ PHP Perl Java JDBC等)中使用特定&amp;lsquo;逃脱字符&amp;rsquo;函数;&lt;/p&gt; &lt;p&gt;　　在因特网上使用mysql数据库时一定少用传输明文的数据，而用SSL和SSH的加密方式数据来传输;&lt;/p&gt; &lt;p&gt;　　14.学会使用tcpdump和strings工具来查看传输数据的安全性，例如tcpdump -l -i eth0 -w -src or dst port 3306 strings。以普通用户来启动mysql数据库服务;&lt;/p&gt; &lt;p&gt;　　15.不使用到表的联结符号，选用的参数 --skip-symbolic-links;&lt;/p&gt; &lt;p&gt;　　16.确信在mysql目录中只有启动数据库服务的用户才可以对文件有读和写的权限;&lt;/p&gt; &lt;p&gt;　　17.不许将process或super权限付给非管理用户，该mysqladmin processlist可以列举出当前执行的查询文本;super权限可用于切断客户端连接、改变服务器运行参数状态、控制拷贝复制数据库的服务器;&lt;/p&gt; &lt;p&gt;　　18.file权限不付给管理员以外的用户，防止出现load data &amp;#39;/etc/passwd&amp;#39;到表中再用select 显示出来的问题;&lt;/p&gt; &lt;p&gt;　　19.如果不相信DNS服务公司的服务，可以在主机名称允许表中只设置IP数字地址;&lt;/p&gt; &lt;p&gt;　　20.使用max_user_connections变量来使mysqld服务进程，对一个指定帐户限定连接数;&lt;/p&gt; &lt;p&gt;　　21.grant语句也支持资源控制选项;&lt;/p&gt; &lt;p&gt;　　22.启动mysqld服务进程的安全选项开关，--local-infile=0或1 若是0则客户端程序就无法使用local load data了，赋权的一个例子grant insert(user) on mysql.user to &amp;#39;user_name&amp;#39;@&amp;#39;host_name&amp;#39;;若使用--skip-grant-tables系统将对任何用户的访问不做任何访问控制，但可以用 mysqladmin flush-privileges或mysqladmin reload来开启访问控制;默认情况是show databases语句对所有用户开放，可以用--skip-show-databases来关闭掉。&lt;/p&gt; &lt;p&gt;　　23.碰到Error 1045(28000) Access Denied for user &amp;#39;root&amp;#39;@&amp;#39;localhost&amp;#39; (Using password:NO)错误时，你需要重新设置密码，具体方法是:先用--skip-grant-tables参数启动mysqld，然后执行 mysql -u root mysql,mysql&amp;gt;update user set password=password(&amp;#39;newpassword&amp;#39;) where user=&amp;#39;root&amp;#39;;mysql&amp;gt;Flush privileges;，最后重新启动mysql就可以了。&lt;/p&gt;</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2008-03-21T19:11:54Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/659">
  <title>终于定下房子了</title>
  <link>http://16hot.blog.isyi.com/post/1/659</link>
  <dc:description>&lt;p&gt;花了半个多月的时间，终于找到一间合适的房间了。&lt;/p&gt;&lt;p&gt;说是房间，当然是只租一套房子的其中一个房间，也就是单间吧。今天交了订金了，要到5月5日才能入住，现在里面有人住着。&lt;/p&gt;&lt;p&gt;&amp;nbsp;在北京找房子还真不容易，要么太贵，要么太远。有朋友说，在北京找房子比找工作还难，呵呵。 &lt;br /&gt;&lt;/p&gt;</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2007-04-14T06:46:45Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/661">
  <title>终于定下房子了</title>
  <link>http://16hot.blog.isyi.com/post/1/661</link>
  <dc:description>&lt;p&gt;花了半个多月的时间，终于找到一间合适的房间了。&lt;/p&gt;&lt;p&gt;说是房间，当然是只租一套房子的其中一个房间，也就是单间吧。今天交了订金了，要到5月5日才能入住，现在里面有人住着。&lt;/p&gt;&lt;p&gt;&amp;nbsp;在北京找房子还真不容易，要么太贵，要么太远。有朋友说，在北京找房子比找工作还难，呵呵。 &lt;br /&gt;&lt;/p&gt;</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2007-04-14T06:46:38Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/660">
  <title>终于定下房子了</title>
  <link>http://16hot.blog.isyi.com/post/1/660</link>
  <dc:description>&lt;p&gt;花了半个多月的时间，终于找到一间合适的房间了。&lt;/p&gt;&lt;p&gt;说是房间，当然是只租一套房子的其中一个房间，也就是单间吧。今天交了订金了，要到5月5日才能入住，现在里面有人住着。&lt;/p&gt;&lt;p&gt;&amp;nbsp;在北京找房子还真不容易，要么太贵，要么太远。有朋友说，在北京找房子比找工作还难，呵呵。 &lt;br /&gt;&lt;/p&gt;</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2007-04-14T06:46:06Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/658">
  <title>将SELECT结果导到文件的操作</title>
  <link>http://16hot.blog.isyi.com/post/1/658</link>
  <dc:description>&lt;h2&gt;1.使用MySQL命令&lt;/h2&gt; &lt;code&gt; SELECT columns FROM table_name WHERE whatever=&amp;#39;something&amp;#39; INTO OUTFILE &amp;quot;/tmp/outfile.txt&amp;quot;; &lt;/code&gt;  &lt;br /&gt;&amp;nbsp;&lt;br /&gt;  &lt;h2&gt;2.命令行方式&lt;/h2&gt; &lt;h3&gt;2.1.管道方式&lt;/h3&gt; &lt;code&gt; echo &amp;quot;SELECT columns FROM table_name WHERE whatever=&amp;#39;something&amp;#39;&amp;quot; | /path/to/mysql -uUSERNAME -pPASSWORD DATABASENAME &amp;gt; /tmp/outfile.txt; &lt;/code&gt;  &lt;br /&gt;&amp;nbsp;&lt;br /&gt;  &lt;h3&gt;2.2.使用SQL文件&lt;/h3&gt; &lt;code&gt; /path/to/mysql -uUSERNAME -pPASSWORD DATABASENAME &amp;lt; /tmp/sql.sql &amp;gt; /tmp/outfile.txt; &lt;/code&gt;</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2007-04-12T18:29:50Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/652">
  <title>终于摆脱MySQL堵塞带来的困扰</title>
  <link>http://16hot.blog.isyi.com/post/1/652</link>
  <dc:description>&lt;p&gt;由于对MySQL的并发插入数据能力没有一个很好的评估，因此在些多进程并发程序时，忽略了MySQL的堵塞问题。&lt;/p&gt;&lt;p&gt;以至程序时不时因为MySQL的堵塞，导致子进程一直在等待MySQL释放堵塞，完成INSERT&amp;nbsp; 指令。&lt;/p&gt;&lt;p&gt;故障现象：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;堵塞的子进程都是 sbwait 状态&lt;/li&gt;&lt;li&gt;父进程，一直在等待子进程结束，是wait状态&lt;/li&gt;&lt;li&gt;如果不手工kill掉堵塞的子进程，这些进程一直存在&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;原因排查：&lt;/p&gt;&lt;p&gt;开始怀疑是socket部分的问题。以为是由于连接服务器时，在等待对方关闭连接而引起的堵塞。&lt;/p&gt;&lt;p&gt;花了很长一段时间来检查和调试socket部分的代码，几次以为已经解决了的时候，又出现故障，都是以失败告终。&lt;/p&gt;&lt;p&gt;这个周末，重新将整个socket连接，数据库连接逐一检查。发现，sbwait 状态时，是由于MySQL的堵塞引起的。多进程并发的情况下，同时抢占MySQL的资源。而MySQL默认表类型，是表锁定的。当A子进程锁定进行插入时，B子进程只能等待。以至并发时，发生堵塞现象。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;解决办法：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;优化表结构和数据结构&lt;/li&gt;&lt;li&gt;更改INSERT INTO为 INSERT DELAYED INTO&lt;/li&gt;&lt;li&gt;更改程序结构，让每个子进程各自打开一个MySQL连接&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;说明： INSERT DELAYED INTO，是客户端提交数据给MySQL，MySQL返回OK状态给客户端。而这是并不是已经将数据插入表，而是存储在内存里面等待排队。当mysql有空余时，再插入。&lt;/p&gt;&lt;p&gt;这样的好处是，提高插入的速度，客户端不需要等待太长时间。坏处是，不能返回自动递增的ID，以及系统崩溃时，MySQL还没有来得及插入数据的话，这些数据将会丢失。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;观测：&lt;/p&gt;&lt;p&gt;做这些调整后，运行了一天，没有出现堵塞情况。并且运行时间也缩短了。&lt;/p&gt;&lt;p&gt;通过phpMyAdmin观测MySQL的进程，提交后，会有一些用户为DELAYED，状态为Waiting for INSERT的进程。过一会，数据完全插入后就消失了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;总结：&lt;/p&gt;&lt;p&gt;一个系统的东西，就要系统的去考虑存在的问题和可能将要发生的问题。不能过于片面的自以为是。&lt;/p&gt;&lt;p&gt;MySQL不是万能的，写程序时，一定要注意MySQL的性能问题。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</dc:description>
      
    <dc:subject>MySQL</dc:subject>
     
    
  <dc:date>2007-02-12T16:54:35Z</dc:date>
    <dc:creator>16hot</dc:creator>
 </item>
  <item rdf:about="http://16hot.blog.isyi.com/post/1/651">
  <title>优化配置mysql服务器（转）</title>
  <link>http://16hot.blog.isyi.com/post/1/651</link>
  <dc:description>你能用这个命令得到mysqld服务器缺省缓冲区大小： &lt;br /&gt;&lt;br /&gt;shell&amp;gt; mysqld --help &lt;br /&gt;&lt;br /&gt;这个命令生成一张所有mysqld选项和可配置变量的表。输出包括缺省值并且看上去象这样一些东西： &lt;br /&gt;&lt;br /&gt;Possible variables for option --set-variable (-O) are: &lt;br /&gt;back_log&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 5 &lt;br /&gt;connect_timeout&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 5 &lt;br /&gt;delayed_insert_timeout&amp;nbsp; current value: 300 &lt;br /&gt;delayed_insert_limit&amp;nbsp; current value: 100 &lt;br /&gt;delayed_queue_size&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 1000 &lt;br /&gt;flush_time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 0 &lt;br /&gt;interactive_timeout&amp;nbsp;&amp;nbsp; current value: 28800 &lt;br /&gt;join_buffer_size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 131072 &lt;br /&gt;key_buffer_size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 1048540 &lt;br /&gt;lower_case_table_names&amp;nbsp; current value: 0 &lt;br /&gt;long_query_time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 10 &lt;br /&gt;max_allowed_packet&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 1048576 &lt;br /&gt;max_connections&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 100 &lt;br /&gt;max_connect_errors&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 10 &lt;br /&gt;max_delayed_threads&amp;nbsp;&amp;nbsp; current value: 20 &lt;br /&gt;max_heap_table_size&amp;nbsp;&amp;nbsp; current value: 16777216 &lt;br /&gt;max_join_size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 4294967295 &lt;br /&gt;max_sort_length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 1024 &lt;br /&gt;max_tmp_tables&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 32 &lt;br /&gt;max_write_lock_count&amp;nbsp; current value: 4294967295 &lt;br /&gt;net_buffer_length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 16384 &lt;br /&gt;query_buffer_size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 0 &lt;br /&gt;record_buffer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 131072 &lt;br /&gt;sort_buffer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 2097116 &lt;br /&gt;table_cache&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 64 &lt;br /&gt;thread_concurrency&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 10 &lt;br /&gt;tmp_table_size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 1048576 &lt;br /&gt;thread_stack&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 131072 &lt;br /&gt;wait_timeout&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current value: 28800 &lt;br /&gt;&lt;br /&gt;如果有一个mysqld服务器正在运行，通过执行这个命令，你可以看到它实际上使用的变量的值： &lt;br /&gt;&lt;br /&gt;shell&amp;gt; mysqladmin variables &lt;br /&gt;&lt;br /&gt;每个选项在下面描述。对于缓冲区大小、长度和栈大小的值以字节给出，你能用于个后缀&amp;ldquo;K&amp;rdquo;或&amp;ldquo;M&amp;rdquo; 指出以K字节或兆字节显示值。例如，16M指出16兆字节。后缀字母的大小写没有关系；16M和16m是相同的。 &lt;br /&gt;&lt;br /&gt;你也可以用命令SHOW STATUS自一个运行的服务器看见一些统计。见7.21 SHOW语法(得到表、列的信息)。 &lt;br /&gt;&lt;br /&gt;back_log &lt;br /&gt;要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 Unix listen(2)系统调用的手册页应该有更多的细节。检查你的OS文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效的。 &lt;br /&gt;connect_timeout &lt;br /&gt;mysqld服务器在用Bad handshake（糟糕的握手）应答前正在等待一个连接报文的秒数。 &lt;br /&gt;delayed_insert_timeout &lt;br /&gt;一个INSERT DELAYED线程应该在终止之前等待INSERT语句的时间。 &lt;br /&gt;delayed_insert_limit &lt;br /&gt;在插入delayed_insert_limit行后，INSERT DELAYED处理器将检查是否有任何SELECT语句未执行。如果这样，在继续前执行允许这些语句。 &lt;br /&gt;delayed_queue_size &lt;br /&gt;应该为处理INSERT DELAYED分配多大一个队列(以行数)。如果排队满了，任何进行INSERT DELAYED的客户将等待直到队列又有空间了。 &lt;br /&gt;flush_time &lt;br /&gt;如果这被设置为非零值，那么每flush_time秒所有表将被关闭(以释放资源和sync到磁盘)。 &lt;br /&gt;interactive_timeout &lt;br /&gt;服务器在关上它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对mysql_real_connect()使用CLIENT_INTERACTIVE选项的客户。也可见wait_timeout。 &lt;br /&gt;join_buffer_size &lt;br /&gt;用于全部联结(join)的缓冲区大小(不是用索引的联结)。缓冲区对2个表间的每个全部联结分配一次缓冲区，当增加索引不可能时，增加该值可得到一个更快的全部联结。（通常得到快速联结的最佳方法是增加索引。） &lt;br /&gt;key_buffer_size &lt;br /&gt;索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小，增加它可得到更好处理的索引(对所有读和多重写)，到你能负担得起那样多。如果你使它太大，系统将开始换页并且真的变慢了。记住既然MySQL不缓存读取的数据，你将必须为OS文件系统缓存留下一些空间。为了在