<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Observer Life &#187; 优化</title>
	<atom:link href="http://observerlife.com/tag/%e4%bc%98%e5%8c%96/feed/" rel="self" type="application/rss+xml" />
	<link>http://observerlife.com</link>
	<description>To be a better man (Observer)</description>
	<lastBuildDate>Sun, 05 Sep 2010 16:21:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>几点不常见的MySQL优化知识</title>
		<link>http://observerlife.com/%e5%87%a0%e7%82%b9%e4%b8%8d%e5%b8%b8%e8%a7%81%e7%9a%84mysql%e4%bc%98%e5%8c%96%e7%9f%a5%e8%af%86/</link>
		<comments>http://observerlife.com/%e5%87%a0%e7%82%b9%e4%b8%8d%e5%b8%b8%e8%a7%81%e7%9a%84mysql%e4%bc%98%e5%8c%96%e7%9f%a5%e8%af%86/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 02:08:45 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[MySql]]></category>
		<category><![CDATA[优化]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=339</guid>
		<description><![CDATA[If you use pgcc and compile everything with -O6, the mysqld server is 1% faster than with gcc 2.95.2. If you link dynamically (without -static), the result is 13% slower on Linux. Note that you still can use a dynamically linked MySQL library for your client applications. It is the server that is most critical [...]]]></description>
			<content:encoded><![CDATA[<ul type="disc">
<li>
<p>If you use <code class="literal">pgcc</code> and compile everything with <code class="option">-O6</code>, the <span><strong class="command">mysqld</strong></span>  server is 1% faster than with <span><strong class="command">gcc</strong></span>  2.95.2.</p>
</li>
<li>
<p>If you link dynamically (without <code class="option">-static</code>), the  result is 13% slower on Linux. Note that you still can use a dynamically linked  MySQL library for your client applications. It is the server that is most  critical for performance.</p>
</li>
<li>
<p>If you strip your <span><strong class="command">mysqld</strong></span> binary  with <code class="literal">strip mysqld</code>, the resulting binary can be up to  4% faster.</p>
</li>
<li>
<p>For a connection from a client to a server running on the same host, if you  connect using TCP/IP rather than a Unix socket file, performance is 7.5% slower.  (On Unix, if you connect to the hostname <code class="literal">localhost</code>,  MySQL uses a socket file by default.)</p>
</li>
<li>
<p>For TCP/IP connections from a client to a server, connecting to a remote  server on another host is 8-11% slower than connecting to the local server on  the same host, even for connections over 100Mb/s Ethernet.</p>
</li>
<li>
<p>When running our benchmark tests using secure connections (all data encrypted  with internal SSL support) performance was 55% slower than for unencrypted  connections.</p>
</li>
<li>
<p>If you compile with <code class="option">--with-debug=full</code>, most queries  are 20% slower. Some queries may take substantially longer; for example, the  MySQL benchmarks ran 35% slower. If you use <code class="option">--with-debug</code> (without <code class="literal">=full</code>), the  slowdown is only 15%. For a version of <span><strong class="command">mysqld</strong></span> that has been compiled with <code class="option">--with-debug=full</code>, you can disable memory checking at  runtime by starting it with the <code class="option">--skip-safemalloc</code>  option. The execution speed should then be close to that obtained when  configuring with <code class="option">--with-debug</code>.</p>
</li>
<li>
<p>On a Sun UltraSPARC-IIe, a server compiled with Forte 5.0 is 4% faster than  one compiled with <span><strong class="command">gcc</strong></span> 3.2.</p>
</li>
<li>
<p>On a Sun UltraSPARC-IIe, a server compiled with Forte 5.0 is 4% faster in  32-bit mode than in 64-bit mode.</p>
</li>
<li>
<p>Compiling with <span><strong class="command">gcc</strong></span> 2.95.2 for  UltraSPARC with the <code class="option">-mcpu=v8 -Wa,-xarch=v8plusa</code>  options gives 4% more performance.</p>
</li>
<li>
<p>On Solaris 2.5.1, MIT-pthreads is 8-12% slower than Solaris native threads on  a single processor. With more load or CPUs, the difference should be larger.</p>
</li>
<li>
<p>Compiling on Linux-x86 using <span><strong class="command">gcc</strong></span>  without frame pointers (<code class="option">-fomit-frame-pointer</code> or <code class="option">-fomit-frame-pointer -ffixed-ebp</code>) makes <span><strong class="command">mysqld</strong></span> 1-4% faster.</p>
</li>
</ul>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/sablog-x%e5%b1%8f%e8%94%bd%e6%9c%ba%e5%99%a8%e4%ba%ba%e5%9e%83%e5%9c%be%e8%af%84%e8%ae%ba%e7%9a%84%e6%96%b9%e6%b3%95/" rel="bookmark" class="crp_title">SaBlog-X屏蔽机器人垃圾评论的方法</a></li><li><a href="http://observerlife.com/xargs%e7%94%a8%e6%b3%95%e4%b8%80%e4%be%8b/" rel="bookmark" class="crp_title">Xargs用法一例</a></li><li><a href="http://observerlife.com/preg_replace_callback%e6%80%8e%e6%a0%b7%e4%bd%bf%e7%94%a8%e7%b1%bb%e4%b8%ad%e7%9a%84%e5%9b%9e%e8%b0%83%e5%87%bd%e6%95%b0/" rel="bookmark" class="crp_title">preg_replace_callback()怎样使用类中的回调函数</a></li><li><a href="http://observerlife.com/mysql5-4%e7%9a%84%e6%94%b9%e8%bf%9b/" rel="bookmark" class="crp_title">MySQL5.4的改进</a></li><li><a href="http://observerlife.com/%e6%89%bf%e8%af%ba/" rel="bookmark" class="crp_title">承诺</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/%e5%87%a0%e7%82%b9%e4%b8%8d%e5%b8%b8%e8%a7%81%e7%9a%84mysql%e4%bc%98%e5%8c%96%e7%9f%a5%e8%af%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>两个CSS在线处理网站</title>
		<link>http://observerlife.com/%e4%b8%a4%e4%b8%aacss%e5%9c%a8%e7%ba%bf%e5%a4%84%e7%90%86%e7%bd%91%e7%ab%99/</link>
		<comments>http://observerlife.com/%e4%b8%a4%e4%b8%aacss%e5%9c%a8%e7%ba%bf%e5%a4%84%e7%90%86%e7%bd%91%e7%ab%99/#comments</comments>
		<pubDate>Mon, 14 May 2007 18:29:24 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[HTML/JavaScript]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[在线]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=153</guid>
		<description><![CDATA[可以在不影响页面显示效果的前提下减少你的CSS代码,我测试了一个css，还真有效果,优化掉近10%。[ 链接 http://flumpcakes.co.uk/css/optimiser/&#160;] 这个则可以把CSS紧凑化[ 链接 http://www.cssdrive.com/index.php/main/csscompressor&#160;] [Copy From : http://cnc.sablog.net/blog/] Related Posts:upgrade《士兵突击》- 许三多是个成功人士《士兵突击》- 当高城遇上袁朗（二）《士兵突击》- 观后感之史今篇《士兵突击》- 任是无情也动人，论袁朗]]></description>
			<content:encoded><![CDATA[<p>可以在不影响页面显示效果的前提下减少你的CSS代码,我测试了一个css，还真有效果,优化掉近10%。<br />[ 链接 <a target="_blank" href="http://flumpcakes.co.uk/css/optimiser/">http://flumpcakes.co.uk/css/optimiser/</a>&nbsp;]</p>
<div class="content">
<p>这个则可以把CSS紧凑化<br />[ 链接 <a target="_blank" href="http://www.cssdrive.com/index.php/main/csscompressor">http://www.cssdrive.com/index.php/main/csscompressor</a>&nbsp;]</p>
<p>[Copy From : <a href="http://cnc.sablog.net/blog/">http://cnc.sablog.net/blog/</a>]</p>
</div>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/upgrade/" rel="bookmark" class="crp_title">upgrade</a></li><li><a href="http://observerlife.com/%e3%80%8a%e5%a3%ab%e5%85%b5%e7%aa%81%e5%87%bb%e3%80%8b-%e8%ae%b8%e4%b8%89%e5%a4%9a%e6%98%af%e4%b8%aa%e6%88%90%e5%8a%9f%e4%ba%ba%e5%a3%ab/" rel="bookmark" class="crp_title">《士兵突击》- 许三多是个成功人士</a></li><li><a href="http://observerlife.com/%e3%80%8a%e5%a3%ab%e5%85%b5%e7%aa%81%e5%87%bb%e3%80%8b-%e5%bd%93%e9%ab%98%e5%9f%8e%e9%81%87%e4%b8%8a%e8%a2%81%e6%9c%97%ef%bc%88%e4%ba%8c%ef%bc%89/" rel="bookmark" class="crp_title">《士兵突击》- 当高城遇上袁朗（二）</a></li><li><a href="http://observerlife.com/%e3%80%8a%e5%a3%ab%e5%85%b5%e7%aa%81%e5%87%bb%e3%80%8b-%e8%a7%82%e5%90%8e%e6%84%9f%e4%b9%8b%e5%8f%b2%e4%bb%8a%e7%af%87/" rel="bookmark" class="crp_title">《士兵突击》- 观后感之史今篇</a></li><li><a href="http://observerlife.com/%e3%80%8a%e5%a3%ab%e5%85%b5%e7%aa%81%e5%87%bb%e3%80%8b-%e4%bb%bb%e6%98%af%e6%97%a0%e6%83%85%e4%b9%9f%e5%8a%a8%e4%ba%ba%ef%bc%8c%e8%ae%ba%e8%a2%81%e6%9c%97/" rel="bookmark" class="crp_title">《士兵突击》- 任是无情也动人，论袁朗</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/%e4%b8%a4%e4%b8%aacss%e5%9c%a8%e7%ba%bf%e5%a4%84%e7%90%86%e7%bd%91%e7%ab%99/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL的优化[zt]</title>
		<link>http://observerlife.com/mysql%e7%9a%84%e4%bc%98%e5%8c%96zt/</link>
		<comments>http://observerlife.com/mysql%e7%9a%84%e4%bc%98%e5%8c%96zt/#comments</comments>
		<pubDate>Thu, 26 Apr 2007 01:32:27 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[MySql]]></category>
		<category><![CDATA[优化]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=152</guid>
		<description><![CDATA[(本文是Monty在O&#8217;Reilly Open Source Convention 2000大会上的演讲) MySQL的优化(本文是Monty在O&#8217;Reilly Open Source Convention 2000大会上的演讲) [晏子 编译整理] 一、我们可以且应该优化什么？ 硬件 操作系统/软件库 SQL服务器(设置和查询) 应用编程接口(API) 应用程序 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 二、优化硬件 如果你需要庞大的数据库表(&#62;2G)，你应该考虑使用64位的硬件结构，像Alpha、Sparc或即将推出的IA64。因为MySQL内部使用大量64位的整数，64位的CPU将提供更好的性能。 对大数据库，优化的次序一般是RAM、快速硬盘、CPU能力。 更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新。 如果不使用事务安全(transaction-safe)的表或有大表并且想避免长文件检查，一台UPS就能够在电源故障时让系统安全关闭。 对于数据库存放在一个专用服务器的系统，应该考虑1G的以太网。延迟与吞吐量同样重要。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 三、优化磁盘 为系统、程序和临时文件配备一个专用磁盘，如果确是进行很多修改工作，将更新日志和事务日志放在专用磁盘上。低 寻道时间对数据库磁盘非常重要。对与大表，你可以估计你将需要log(行数)/log(索引块长度/3*2/(键码长度 + 数据指针长度))+1次寻到才能找到一行。对于有500000行的表，索引Mediun int类型的列，需要log(500000) / log(1024/3*2/(3 + 2))+1=4次寻道。上述索引需要500000*7*3/2=5.2M的空间。实际上，大多数块将被缓存，所以大概只需要1-2次寻道。然而对于写入（如上），你将需要4次寻道请求来找到在哪里存放新键码，而且一般要2次寻道来更新索引并写入一行。对于非常大的数据库，你的应用将受到磁盘寻道速度的限制，随着数据量的增加呈N log N数据级递增。将数据库和表分在不同的磁盘上。在MySQL中，你可以为此而使用符号链接。条列磁盘(RAID 0)将提高读和写的吞吐量。带镜像的条列(RAID 0+1)将更安全并提高读取的吞吐量。写入的吞吐量将有所降低。不要对临时文件或可以很容易地重建的数据所在的磁盘使用镜像或RAID(除了RAID 0)。在Linux上，在引导时对磁盘使用命令hdparm -m16 -d1以启用同时读写多个扇区和DMA功能。这可以将响应时间提高5~50%。在Linux上，用async (默认)和noatime挂载磁盘(mount)。对于某些特定应用，可以对某些特定表使用内存磁盘，但通常不需要。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 四、优化操作系统 不要交换区。如果内存不足，增加更多的内存或配置你的系统使用较少内存。不要使用NFS磁盘(会有NFS锁定的问题)。增加系统和MySQL服务器的打开文件数量。(在safe_mysqld脚本中加入ulimit -n #)。增加系统的进程和线程数量。如果你有相对较少的大表，告诉文件系统不要将文件打碎在不同的磁道上(Solaris)。使用支持大文件的文件系统(Solaris)。选择使用哪种文件系统。在Linux上的Reiserfs对于打开、读写都非常快。文件检查只需几秒种。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 五、选择应用编程接口 PERL可在不同的操作系统和数据库之间移植。适宜快速原型。应该使用DBI/DBD接口。PHP比PERL易学。使用比PERL少的资源。通过升级到PHP4可以获得更快的速度。CMySQL的原生接口。较快并赋予更多的控制。低层，所以必须付出更多。C++较高层次，给你更多的时间来编写应用。仍在开发中ODBC运行在Windows和Unix上。几乎可在不同的SQL服务器间移植。较慢。MyODBC只是简单的直通驱动程序，比用原生接口慢19%。有很多方法做同样的事。很难像很多ODBC驱动程序那样运行，在不同的领域还有不同的错误。问题成堆。Microsoft偶尔还会改变接口。不明朗的未来。(Microsoft更推崇OLE而非ODBC)ODBC运行在Windows和Unix上。几乎可在不同的SQL服务器间移植。较慢。MyODBC只是简单的直通驱动程序，比用原生接口慢19%。有很多方法做同样的事。很难像很多ODBC驱动程序那样运行，在不同的领域还有不同的错误。问题成堆。Microsoft偶尔还会改变接口。不明朗的未来。(Microsoft更推崇OLE而非ODBC)JDBC理论上可在不同的操作系统何时据库间移植。可以运行在web客户端。Python和其他可能不错，可我们不用它们。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 六、优化应用 应该集中精力解决问题。在编写应用时，应该决定什么是最重要的：速度操作系统间的可移植性SQL服务器间的可移植性使用持续的连接。.缓存应用中的数据以减少SQL服务器的负载。不要查询应用中不需要的列。不要使用SELECT [...]]]></description>
			<content:encoded><![CDATA[<p>(本文是Monty在O&#8217;Reilly Open Source Convention 2000大会上的演讲) </p>
<p>MySQL的优化<br />(本文是Monty在O&#8217;Reilly Open Source Convention 2000大会上的演讲) </p>
<p>[晏子 编译整理] </p>
<p>一、我们可以且应该优化什么？ </p>
<p>硬件 </p>
<p>操作系统/软件库 </p>
<p>SQL服务器(设置和查询) </p>
<p>应用编程接口(API) </p>
<p>应用程序 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>二、优化硬件 </p>
<p>如果你需要庞大的数据库表(&gt;2G)，你应该考虑使用64位的硬件结构，像Alpha、Sparc或即将推出的IA64。因为MySQL内部使用大量64位的整数，64位的CPU将提供更好的性能。 </p>
<p>对大数据库，优化的次序一般是RAM、快速硬盘、CPU能力。 </p>
<p>更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新。 </p>
<p>如果不使用事务安全(transaction-safe)的表或有大表并且想避免长文件检查，一台UPS就能够在电源故障时让系统安全关闭。 </p>
<p>对于数据库存放在一个专用服务器的系统，应该考虑1G的以太网。延迟与吞吐量同样重要。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>三、优化磁盘 </p>
<p>为系统、程序和临时文件配备一个专用磁盘，如果确是进行很多修改工作，将更新日志和事务日志放在专用磁盘上。<br />低 寻道时间对数据库磁盘非常重要。对与大表，你可以估计你将需要log(行数)/log(索引块长度/3*2/(键码长度 + 数据指针长度))+1次寻到才能找到一行。对于有500000行的表，索引Mediun int类型的列，需要log(500000) / log(1024/3*2/(3 + 2))+1=4次寻道。上述索引需要500000*7*3/2=5.2M的空间。实际上，大多数块将被缓存，所以大概只需要1-2次寻道。<br />然而对于写入（如上），你将需要4次寻道请求来找到在哪里存放新键码，而且一般要2次寻道来更新索引并写入一行。<br />对于非常大的数据库，你的应用将受到磁盘寻道速度的限制，随着数据量的增加呈N log N数据级递增。<br />将数据库和表分在不同的磁盘上。在MySQL中，你可以为此而使用符号链接。<br />条列磁盘(RAID 0)将提高读和写的吞吐量。<br />带镜像的条列(RAID 0+1)将更安全并提高读取的吞吐量。写入的吞吐量将有所降低。<br />不要对临时文件或可以很容易地重建的数据所在的磁盘使用镜像或RAID(除了RAID 0)。<br />在Linux上，在引导时对磁盘使用命令hdparm -m16 -d1以启用同时读写多个扇区和DMA功能。这可以将响应时间提高5~50%。<br />在Linux上，用async (默认)和noatime挂载磁盘(mount)。<br />对于某些特定应用，可以对某些特定表使用内存磁盘，但通常不需要。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>四、优化操作系统 </p>
<p>不要交换区。如果内存不足，增加更多的内存或配置你的系统使用较少内存。<br />不要使用NFS磁盘(会有NFS锁定的问题)。<br />增加系统和MySQL服务器的打开文件数量。(在safe_mysqld脚本中加入ulimit -n #)。<br />增加系统的进程和线程数量。<br />如果你有相对较少的大表，告诉文件系统不要将文件打碎在不同的磁道上(Solaris)。<br />使用支持大文件的文件系统(Solaris)。<br />选择使用哪种文件系统。在Linux上的Reiserfs对于打开、读写都非常快。文件检查只需几秒种。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>五、选择应用编程接口 </p>
<p>PERL<br />可在不同的操作系统和数据库之间移植。<br />适宜快速原型。<br />应该使用DBI/DBD接口。<br />PHP<br />比PERL易学。<br />使用比PERL少的资源。<br />通过升级到PHP4可以获得更快的速度。<br />C<br />MySQL的原生接口。<br />较快并赋予更多的控制。<br />低层，所以必须付出更多。<br />C++<br />较高层次，给你更多的时间来编写应用。<br />仍在开发中<br />ODBC<br />运行在Windows和Unix上。<br />几乎可在不同的SQL服务器间移植。<br />较慢。MyODBC只是简单的直通驱动程序，比用原生接口慢19%。<br />有很多方法做同样的事。很难像很多ODBC驱动程序那样运行，在不同的领域还有不同的错误。<br />问题成堆。Microsoft偶尔还会改变接口。<br />不明朗的未来。(Microsoft更推崇OLE而非ODBC)<br />ODBC<br />运行在Windows和Unix上。<br />几乎可在不同的SQL服务器间移植。<br />较慢。MyODBC只是简单的直通驱动程序，比用原生接口慢19%。<br />有很多方法做同样的事。很难像很多ODBC驱动程序那样运行，在不同的领域还有不同的错误。<br />问题成堆。Microsoft偶尔还会改变接口。<br />不明朗的未来。(Microsoft更推崇OLE而非ODBC)<br />JDBC<br />理论上可在不同的操作系统何时据库间移植。<br />可以运行在web客户端。<br />Python和其他<br />可能不错，可我们不用它们。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>六、优化应用 </p>
<p>应该集中精力解决问题。<br />在编写应用时，应该决定什么是最重要的：<br />速度<br />操作系统间的可移植性<br />SQL服务器间的可移植性<br />使用持续的连接。.<br />缓存应用中的数据以减少SQL服务器的负载。<br />不要查询应用中不需要的列。<br />不要使用SELECT * FROM table_name&#8230;<br />测试应用的所有部分，但将大部分精力放在在可能最坏的合理的负载下的测试整体应用。通过以一种模块化的方式进行，你应该能用一个快速&ldquo;哑模块&rdquo;替代找到的瓶颈，然后很容易地标出下一个瓶颈。<br />如果在一个批处理中进行大量修改，使用LOCK TABLES。例如将多个UPDATES或DELETES集中在一起。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>七、应该使用可移植的应用 </p>
<p>Perl DBI/DBD<br />ODBC<br />JDBC<br />Python(或其他有普遍SQL接口的语言)<br />你应该只使用存在于所有目的SQL服务器中或可以很容易地用其他构造模拟的SQL构造。www.mysql.com上的Crash-me页可以帮助你。<br />为操作系统/SQL服务器编写包装程序来提供缺少的功能。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>八、如果你需要更快的速度，你应该： </p>
<p>找出瓶颈(CPU、磁盘、内存、SQL服务器、操作系统、API或应用)并集中全力解决。<br />使用给予你更快速度/灵活性的扩展。<br />逐渐了解SQL服务器以便能为你的问题使用可能最快的SQL构造并避免瓶颈。<br />优化表布局和查询。<br />使用复制以获得更快的选择(select)速度。<br />如果你有一个慢速的网络连接数据库，使用压缩客户/服务器协议。<br />不要害怕时应用的第一个版本不能完美地移植，在你解决问题时，你总是可以在以后优化它。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>九、优化MySQL </p>
<p>挑选编译器和编译选项。<br />位你的系统寻找最好的启动选项。<br />通读MySQL参考手册并阅读Paul DuBios的《MySQL》一书。(已有中文版-译注)<br />多用EXPLAIN SELECT、SHOW VARIABLES、SHOW STATUS和SHOW PROCESSLIST。<br />了解查询优化器的工作原理。<br />优化表的格式。<br />维护你的表(myisamchk、CHECK TABLE、 OPTIMIZE TABLE)<br />使用MySQL的扩展功能以让一切快速完成。<br />如果你注意到了你将在很多场合需要某些函数，编写MySQL UDF函数。<br />不要使用表级或列级的GRANT，除非你确实需要。<br />购买MySQL技术支持以帮助你解决问题:) </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>十、编译和安装MySQL </p>
<p>通过位你的系统挑选可能最好的编译器，你通常可以获得10-30%的性能提高。<br />在Linux/Intel平台上，用pgcc(gcc的奔腾芯片优化版)编译MySQL。然而，二进制代码将只能运行在Intel奔腾CPU上。<br />对于一种特定的平台，使用MySQL参考手册上推荐的优化选项。<br />一般地，对特定CPU的原生编译器(如Sparc的Sun Workshop)应该比gcc提供更好的性能，但不总是这样。<br />用你将使用的字符集编译MySQL。<br />静态编译生成mysqld的执行文件(用&#8211;with-mysqld-ldflags=all-static)并用strip sql/mysqld整理最终的执行文件。<br />注意，既然MySQL不使用C++扩展，不带扩展支持编译MySQL将赢得巨大的性能提高。<br />如果操作系统支持原生线程，使用原生线程(而不用mit-pthreads)。<br />用MySQL基准测试来测试最终的二进制代码。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>十一、维护 </p>
<p>如果可能，偶尔运行一下OPTIMIZE table，这对大量更新的变长行非常重要。<br />偶尔用myisamchk -a更新一下表中的键码分布统计。记住在做之前关掉MySQL。<br />如果有碎片文件，可能值得将所有文件复制到另一个磁盘上，清除原来的磁盘并拷回文件。<br />如果遇到问题，用myisamchk或CHECK table检查表。<br />用mysqladmin -i10 precesslist extended-status监控MySQL的状态。<br />用MySQL GUI客户程序，你可以在不同的窗口内监控进程列表和状态。<br />使用mysqladmin debug获得有关锁定和性能的信息。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>十二、优化SQL </p>
<p>扬SQL之长，其它事情交由应用去做。使用SQL服务器来做： </p>
<p>找出基于WHERE子句的行。<br />JOIN表<br />GROUP BY<br />ORDER BY<br />DISTINCT<br />不要使用SQL来做： </p>
<p>检验数据(如日期)<br />成为一只计算器<br />技巧： </p>
<p>明智地使用键码。<br />键码适合搜索，但不适合索引列的插入/更新。<br />保持数据为数据库第三范式，但不要担心冗余信息或这如果你需要更快的速度，创建总结表。<br />在大表上不做GROUP BY，相反创建大表的总结表并查询它。<br />UPDATE table set count=count+1 where key_column=constant非常快。<br />对于大表，或许最好偶尔生成总结表而不是一直保持总结表。<br />充分利用INSERT的默认值。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>十三、不同SQL服务器的速度差别（以秒计） </p>
<p>　 </p>
<p>通过键码读取2000000行： NT Linux<br />mysql 367 249<br />mysql_odbc 464 　<br />db2_odbc 1206 　<br />informix_odbc 121126 　<br />ms-sql_odbc 1634 　<br />oracle_odbc 20800 　<br />solid_odbc 877 　<br />sybase_odbc 17614 　<br />　<br />插入350768行： NT Linux<br />mysql 381 206<br />mysql_odbc 619 　<br />db2_odbc 3460 　<br />informix_odbc 2692 　<br />ms-sql_odbc 4012 　<br />oracle_odbc 11291 　<br />solid_odbc 1801 　<br />sybase_odbc 4802 　 </p>
<p>在上述测试中，MySQL配置8M高速缓存运行，其他数据库以默认安装运行。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>十四、重要的MySQL启动选项 </p>
<p>back_log 如果需要大量新连接，修改它。<br />thread_cache_size 如果需要大量新连接，修改它。<br />key_buffer_size 索引页池，可以设成很大。<br />bdb_cache_size BDB表使用的记录和键吗高速缓存。<br />table_cache 如果有很多的表和并发连接，修改它。<br />delay_key_write 如果需要缓存所有键码写入，设置它。<br />log_slow_queries 找出需花大量时间的查询。<br />max_heap_table_size 用于GROUP BY<br />sort_buffer 用于ORDER BY和GROUP BY<br />myisam_sort_buffer_size 用于REPAIR TABLE<br />join_buffer_size 在进行无键吗的联结时使用。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>十五、优化表 </p>
<p>MySQL拥有一套丰富的类型。你应该对每一列尝试使用最有效的类型。<br />ANALYSE过程可以帮助你找到表的最优类型：SELECT * FROM table_name PROCEDURE ANALYSE()。<br />对于不保存NULL值的列使用NOT NULL，这对你想索引的列尤其重要。<br />将ISAM类型的表改为MyISAM。<br />如果可能，用固定的表格式创建表。<br />不要索引你不想用的东西。<br />利用MySQL能按一个索引的前缀进行查询的事实。如果你有索引INDEX(a,b)，你不需要在a上的索引。<br />不在长CHAR/VARCHAR列上创建索引，而只索引列的一个前缀以节省存储空间。CREATE TABLE table_name (hostname CHAR(255) not null, index(hostname(10)))<br />对每个表使用最有效的表格式。<br />在不同表中保存相同信息的列应该有同样的定义并具有相同的列名。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>十六、MySQL如何次存储数据 </p>
<p>数据库以目录存储。<br />表以文件存储。<br />列以变长或定长格式存储在文件中。对BDB表，数据以页面形式存储。<br />支持基于内存的表。<br />数据库和表可在不同的磁盘上用符号连接起来。<br />在Windows上，MySQL支持用.sym文件内部符号连接数据库。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>十七、MySQL表类型 </p>
<p>HEAP表：固定行长的表，只存储在内存中并用HASH索引进行索引。<br />ISAM表：MySQL 3.22中的早期B-tree表格式。<br />MyIASM：IASM表的新版本，有如下扩展：<br />二进制层次的可移植性。<br />NULL列索引。<br />对变长行比ISAM表有更少的碎片。<br />支持大文件。<br />更好的索引压缩。<br />更好的键吗统计分布。<br />更好和更快的auto_increment处理。<br />来自Sleepcat的Berkeley DB(BDB)表：事务安全(有BEGIN WORK/COMMIT|ROLLBACK)。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>十八、MySQL行类型（专指IASM/MyIASM表） </p>
<p>如果所有列是定长格式(没有VARCHAR、BLOB或TEXT)，MySQL将以定长表格式创建表，否则表以动态长度格式创建。<br />定长格式比动态长度格式快很多并更安全。<br />动态长度行格式一般占用较少的存储空间，但如果表频繁更新，会产生碎片。<br />在某些情况下，不值得将所有VARCHAR、BLOB和TEXT列转移到另一个表中，只是获得主表上的更快速度。<br />利用myiasmchk（对ISAM，pack_iasm），可以创建只读压缩表，这使磁盘使用率最小，但使用慢速磁盘时，这非常不错。压缩表充分地利用将不再更新的日志表 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>十九、MySQL高速缓存（所有线程共享，一次性分配） </p>
<p>键码缓存：key_buffer_size，默认8M。<br />表缓存：table_cache，默认64。<br />线程缓存：thread_cache_size，默认0。<br />主机名缓存：可在编译时修改，默认128。<br />内存映射表：目前仅用于压缩表。<br />注意：MySQL没有行高速缓存，而让操作系统处理。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>二十、MySQL缓存区变量（非共享，按需分配） </p>
<p>sort_buffer：ORDER BY/GROUP BY<br />record_buffer：扫描表。<br />join_buffer_size：无键联结<br />myisam_sort_buffer_size：REPAIR TABLE<br />net_buffer_length:对于读SQL语句并缓存结果。<br />tmp_table_size：临时结果的HEAP表大小。<br />　 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>二十一、MySQL表高速缓存工作原理 </p>
<p>每个MyISAM表的打开实例(instance)使用一个索引文件和一个数据文件。如果表被两个线程使用或在同一条查询中使用两次，MyIASM将共享索引文件而是打开数据文件的另一个实例。<br />如果所有在高速缓存中的表都在使用，缓存将临时增加到比表缓存尺寸大些。如果是这样，下一个被释放的表将被关闭。<br />你可以通过检查mysqld的Opened_tables变量以检查表缓存是否太小。如果该值太高，你应该增大表高速缓存。<br />　 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>二十二、MySQL扩展/优化-提供更快的速度 </p>
<p>使用优化的表类型（HEAP、MyIASM或BDB表）。<br />对数据使用优化的列。<br />如果可能使用定长行。<br />使用不同的锁定类型（SELECT HIGH_PRIORITY，INSERT LOW_PRIORITY）<br />Auto_increment<br />REPLACE (REPLACE INTO table_name VALUES (&#8230;))<br />INSERT DELAYED<br />LOAD DATA INFILE / LOAD_FILE()<br />使用多行INSERT一次插入多行。<br />SELECT INTO OUTFILE<br />LEFT JOIN, STRAIGHT JOIN<br />LEFT JOIN ，结合IS NULL<br />ORDER BY可在某些情况下使用键码。<br />如果只查询在一个索引中的列，将只使用索引树解决查询。<br />联结一般比子查询快（对大多数SQL服务器亦如此）。<br />LIMIT<br />SELECT * from table1 WHERE a &gt; 10 LIMIT 10,20<br />DELETE * from table1 WHERE a &gt; 10 LIMIT 10<br />foo IN (常数列表) 高度优化。<br />GET_LOCK()/RELEASE_LOCK()<br />LOCK TABLES<br />INSERT和SELECT可同时运行。<br />UDF函数可装载进一个正在运行的服务器。<br />压缩只读表。<br />CREATE TEMPORARY TABLE<br />CREATE TABLE .. SELECT<br />带RAID选项的MyIASM表将文件分割成很多文件以突破某些文件系统的2G限制。<br />Delay_keys<br />复制功能 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>二十二、MySQL何时使用索引 </p>
<p>对一个键码使用&gt;, &gt;=, =, 1 and key_part1 explain select t3.DateOfAction, t1.TransactionID<br />-&gt; from t1 join t2 join t3<br />-&gt; where t2.ID = t1.TransactionID and t3.ID = t2.GroupID<br />-&gt; order by t3.DateOfAction, t1.TransactionID;<br />+&#8212;&#8212;-+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />| table | type | possible_keys | key | key_len | ref | rows | Extra |<br />+&#8212;&#8212;-+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />| t1 | ALL | NULL | NULL | NULL | NULL | 11 | Using temporary; Using filesort |<br />| t2 | ref | ID | ID | 4 | t1.TransactionID | 13 | |<br />| t3 | eq_ref | PRIMARY | PRIMARY | 4 | t2.GroupID | 1 | |<br />+&#8212;&#8212;-+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />ALL和范围类型提示一个潜在的问题。<br />　 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>二十五、学会使用SHOW PROCESSLIST </p>
<p>使用SHOW processlist来发现正在做什么：<br />+&#8212;-+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8211;+&#8212;-+&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />| Id | User | Host | db | Command | Time | State | Info |<br />+&#8212;-+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8211;+&#8212;-+&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />| 6 | monty | localhost | bp | Query | 15 | Sending data | select * from station,station as s1 |<br />| 8 | monty | localhost | | Query | 0 | | show processlist |<br />+&#8212;-+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8211;+&#8212;-+&#8212;&#8212;&#8212;+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />在mysql或mysqladmin中用KILL来杀死溜掉的线程。<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>二十六、如何知晓MySQL解决一条查询 </p>
<p>运行项列命令并试图弄明白其输出：<br />SHOW VARIABLES;<br />SHOW COLUMNS FROM &#8230;G<br />EXPLAIN SELECT &#8230;G<br />FLUSH STATUS;<br />SELECT &#8230;;<br />SHOW STATUS; </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>二十七、MySQL非常不错 </p>
<p>日志<br />在进行很多连接时，连接非常快。<br />同时使用SELECT和INSERT的场合。<br />在不把更新与耗时太长的选择结合时。<br />在大多数选择/更新使用唯一键码时。<br />在使用没有长时间冲突锁定的多个表时。<br />在用大表时(MySQL使用一个非常紧凑的表格式)。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>二十八、MySQL应避免的事情 </p>
<p>用删掉的行更新或插入表，结合要耗时长的SELECT。<br />在能放在WHERE子句中的列上用HAVING。<br />不使用键码或键码不够唯一而进行JOIN。<br />在不同列类型的列上JOIN。<br />在不使用=匹配整个键码时使用HEAP表。<br />在MySQL监控程序中忘记在UPDATE或DELETE中使用一条WHERE子句。如果想这样做，使用mysql客户程序的&#8211;i-am-a-dummy选项。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>二十九、MySQL各种锁定 </p>
<p>内部表锁定<br />LOCK TABLES（所有表类型适用）<br />GET LOCK()/RELEASE LOCK()<br />页面锁定（对BDB表）<br />ALTER TABLE也在BDB表上进行表锁定<br />LOCK TABLES允许一个表有多个读者和一个写者。<br />一般WHERE锁定具有比READ锁定高的优先级以避免让写入方干等。对于不重要的写入方，可以使用LOW_PRIORITY关键字让锁定处理器优选读取方。<br />UPDATE LOW_PRIORITY SET value=10 WHERE id=10; </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>三十、给MySQL更多信息以更好地解决问题的技巧 注意你总能去掉(加注释)MySQL功能以使查询可移植： </p>
<p>SELECT /*! SQL_BUFFER_RESULTS */ &#8230;<br />SELECT SQL_BUFFER_RESULTS &#8230;<br />将强制MySQL生成一个临时结果集。只要所有临时结果集生成后，所有表上的锁定均被释放。这能在遇到表锁定问题时或要花很长时间将结果传给客户端时有所帮助。<br />SELECT SQL_SMALL_RESULT &#8230; GROUP BY &#8230;<br />告诉优化器结果集将只包含很少的行。<br />SELECT SQL_BIG_RESULT &#8230; GROUP BY &#8230;<br />告诉优化器结果集将包含很多行。<br />SELECT STRAIGHT_JOIN &#8230;<br />强制优化器以出现在FROM子句中的次序联结表。<br />SELECT &#8230; FROM table_name [USE INDEX (index_list) | IGNORE INDEX (index_list)] table_name2<br />强制MySQL使用/忽略列出的索引。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>三十一、事务的例子 </p>
<p>MyIASM表如何进行事务处理:<br />mysql&gt; LOCK TABLES trans READ, customer WRITE;<br />mysql&gt; select sum(value) from trans where customer_id=some_id;<br />mysql&gt; update customer set total_value=sum_from_previous_statement<br />where customer_id=some_id;<br />mysql&gt; UNLOCK TABLES;<br />BDB表如何进行事务:<br />mysql&gt; BEGIN WORK;<br />mysql&gt; select sum(value) from trans where customer_id=some_id;<br />mysql&gt; update customer set total_value=sum_from_previous_statement<br />where customer_id=some_id;<br />mysql&gt; COMMIT;<br />注意你可以通过下列语句回避事务:<br />UPDATE customer SET value=value+new_value WHERE customer_id=some_id; </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>三十二、使用REPLACE的例子 </p>
<p>REPLACE的功能极像INSERT，除了如果一条老记录在一个唯一索引上具有与新纪录相同的值，那么老记录在新纪录插入前则被删除。不使用 SELECT 1 FROM t1 WHERE key=#<br />IF found-row<br />LOCK TABLES t1<br />DELETE FROM t1 WHERE key1=#<br />INSERT INTO t1 VALUES (&#8230;)<br />UNLOCK TABLES t1;<br />ENDIF<br />而用<br />REPLACE INTO t1 VALUES (&#8230;) </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>三十三、一般技巧 </p>
<p>使用短主键。联结表时使用数字而非字符串。<br />当使用多部分键码时，第一部分应该时最常用的部分。<br />有疑问时，首先使用更多重复的列以获得更好地键码压缩。<br />如果在同一台机器上运行MySQL客户和服务器，那么在连接MySQL时则使用套接字而不是TCP/IP（这可以提高性能7.5%）。可在连接MySQL服务器时不指定主机名或主机名为localhost来做到。<br />如果可能，使用&#8211;skip-locking(在某些OS上为默认)，这将关闭外部锁定并将提高性能。<br />使用应用层哈希值而非长键码：<br />SELECT * FROM table_name WHERE hash=MD5(concat(col1,col2)) AND<br />col_1=&#8217;constant&#8217; AND col_2=&#8217;constant&#8217;<br />在文件中保存需要以文件形式访问的BLOB，在数据库中只保存文件名。<br />删除所有行比删除一大部分行要快。<br />如果SQL不够快，研究一下访问数据的较底层接口。 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>三十四、使用MySQL 3.23的好处 </p>
<p>MyISAM：可移植的大表格式<br />HEAP：内存中的表<br />Berkeley DB：支持事务的表。<br />众多提高的限制<br />动态字符集<br />更多的STATUS变量<br />CHECK和REPAIR表<br />更快的GROUP BY和DISTINCT<br />LEFT JOIN &#8230; IF NULL的优化<br />CREATE TABLE &#8230; SELECT<br />CREATE TEMPORARY table_name (&#8230;)<br />临时HEAP表到MyISAM表的自动转换<br />复制<br />mysqlhotcopy脚本 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>三十五、正在积极开发的重要功能 </p>
<p>改进事务处理<br />失败安全的复制<br />正文搜索<br />多个表的删除(之后完成多个表的更新)<br />更好的键码缓存<br />原子RENAME (RENAME TABLE foo as foo_old, foo_new as foo)<br />查询高速缓存<br />MERGE TABLES<br />一个更好的GUI客户程序</p>
<p>&nbsp;</p>
<p>来源：<a href="http://www.imysql.cn/?q=node/22">http://www.imysql.cn/?q=node/22</a></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/mysql%e6%9f%a5%e8%af%a2%e4%bc%98%e5%8c%96%e7%b3%bb%e5%88%97%e8%ae%b2%e5%ba%a7%e4%b9%8b%e6%9f%a5%e8%af%a2%e4%bc%98%e5%8c%96%e5%99%a8%e4%b8%80/" rel="bookmark" class="crp_title">MySQL查询优化系列讲座之查询优化器(一)</a></li><li><a href="http://observerlife.com/mysql5-4%e7%9a%84%e6%94%b9%e8%bf%9b/" rel="bookmark" class="crp_title">MySQL5.4的改进</a></li><li><a href="http://observerlife.com/mysql%e6%95%b0%e6%8d%ae%e7%9a%84%e5%af%bc%e5%87%ba%e5%92%8c%e5%af%bc%e5%85%a5%e5%b7%a5%e5%85%b7mysqldump/" rel="bookmark" class="crp_title">MySQL数据的导出和导入工具:mysqldump</a></li><li><a href="http://observerlife.com/firefox%e5%92%8cie%e4%b8%8bdisplay%e5%b1%9e%e6%80%a7%e4%b8%8d%e5%85%bc%e5%ae%b9%e7%9a%84%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95/" rel="bookmark" class="crp_title">Firefox和IE下display属性不兼容的解决办法</a></li><li><a href="http://observerlife.com/vim-quick-reference-card/" rel="bookmark" class="crp_title">VIM QUICK REFERENCE CARD</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/mysql%e7%9a%84%e4%bc%98%e5%8c%96zt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flickr 的开发者的 Web 应用优化技巧</title>
		<link>http://observerlife.com/flickr-%e7%9a%84%e5%bc%80%e5%8f%91%e8%80%85%e7%9a%84-web-%e5%ba%94%e7%94%a8%e4%bc%98%e5%8c%96%e6%8a%80%e5%b7%a7/</link>
		<comments>http://observerlife.com/flickr-%e7%9a%84%e5%bc%80%e5%8f%91%e8%80%85%e7%9a%84-web-%e5%ba%94%e7%94%a8%e4%bc%98%e5%8c%96%e6%8a%80%e5%b7%a7/#comments</comments>
		<pubDate>Wed, 11 Apr 2007 07:25:17 +0000</pubDate>
		<dc:creator>ycg</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.kedy.cn/blog/?p=148</guid>
		<description><![CDATA[作者：Fenng &#124; English Version 【可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】网址：http://www.dbanotes.net/web/flickr_web_tech.html &#160; Cal Henderson　是大名鼎鼎的 Flickr 网站的开发者之一．在一篇名为 Serving JavaScript Fast 的文章中，他介绍了用于 Flickr 站点应用优化的技巧，读罢感觉获益良多．&#34;嚼一下别人的馍&#34;，概括一下该文的主要内容． Flickr 是 Web 2.0 的代表站点。面对的网络问题除了一般 Web 站点都会有的内容优化之外, 还有必须要灵活处理 JavaScript 与 CSS 的频繁变化后部署分发带来的复杂性。 设定文件大小的策略 首先面临的一个问题是把所有的 JavaScript 与 CSS 放到一个文件中好呢，还是分割成多个文件 ? 从减少网络请求的角度上考虑, 前者更好，后者差。但是从并行的角度考虑, IE 与 Firefox 默认情况下都只能同时从一个域请求两个资源. 这会在很多情况下给用户带来不良的使用体验&#8211;必须所有的文件都下载完毕才可以看到像样的页面. Flickr 采用了折衷的办法&#8211;在保持文件数量尽可能少的情况下，把 JavaScript 与 CSS 分成多个子文件. 这在开发上带来了复杂性，但是对性能的收益是巨大的。 压缩的优化问题 毫无疑问，对站点内容进行压缩是一个比较常用的 Web 优化手段．但是并不一定都能达到理想的效果．原因在于 mod-gzip [...]]]></description>
			<content:encoded><![CDATA[<p>作者：<a href="http://www.dbanotes.net/">Fenng</a> | <a class="English" href="http://translate.google.com/translate?langpair=zh-CN%7Cen&amp;hl=zh-CN&amp;ie=UTF8&amp;u=http%3A//www.dbanotes.net/web/flickr_web_tech.html" target="_blank">English Version</a> 【可以任意转载, 转载时请务必以超链接形式标明文章原始出处和作者信息及<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.zh">本声明</a>】<br />网址：<a class="permalink" href="http://www.dbanotes.net/web/flickr_web_tech.html"><font color="#800080">http://www.dbanotes.net/web/flickr_web_tech.html</font></a> </p>
<p class="entry-footer">&nbsp;</p>
<div class="entry-content">
<div class="entry-body">
<p>Cal Henderson　是大名鼎鼎的 <a href="http://www.flickr.com/">Flickr</a> 网站的开发者之一．在一篇名为 <a href="http://www.thinkvitamin.com/features/webapps/serving-%20-fast">Serving JavaScript Fast</a> 的文章中，他介绍了用于 Flickr 站点应用优化的技巧，读罢感觉获益良多．&quot;嚼一下别人的馍&quot;，概括一下该文的主要内容．</p>
<p><a href="http://www.flickr.com/">Flickr</a> 是 Web 2.0 的代表站点。面对的网络问题除了一般 Web 站点都会有的内容优化之外, 还有必须要灵活处理 JavaScript 与 <acronym title="Cascading Style Sheets">CSS</acronym> 的频繁变化后部署分发带来的复杂性。</p>
<p><strong>设定文件大小的策略</strong> 首先面临的一个问题是把所有的 JavaScript 与 <acronym title="Cascading Style Sheets">CSS</acronym> 放到一个文件中好呢，还是分割成多个文件 ? 从减少网络请求的角度上考虑, 前者更好，后者差。但是从并行的角度考虑, <acronym title="Internet Explorer">IE</acronym> 与 Firefox 默认情况下都只能同时从一个域请求两个资源. 这会在很多情况下给用户带来不良的使用体验&#8211;必须所有的文件都下载完毕才可以看到像样的页面. Flickr 采用了折衷的办法&#8211;在保持文件数量尽可能少的情况下，把 JavaScript 与 <acronym title="Cascading Style Sheets">CSS</acronym> 分成多个子文件. 这在开发上带来了复杂性，但是对性能的收益是巨大的。</p>
<p><strong>压缩的优化问题</strong> 毫无疑问，对站点内容进行压缩是一个比较常用的 Web 优化手段．但是并不一定都能达到理想的效果．原因在于 <a href="http://sourceforge.net/projects/mod-gzip/">mod-gzip</a> 模块不但消耗服务器端 <acronym title="Central Processing Unit">CPU</acronym> 资源，也消耗客户端 <acronym title="Central Processing Unit">CPU</acronym> 资源. 而且, mod_gzip 压缩文件后创建的临时文件是放到磁盘上的，这也会给磁盘 <acronym title="Input Output">IO</acronym> 带来严重的问题. Flickr 采用的是 Httpd 2.x 以后支持的　<a href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html">mod_deflate</a> 模块．压缩操作都在内存中进行．mod_deflate 在 Httpd 1.x 是不可用的, 不过可以通过创建 <acronym title="Random Access Memory">RAM</acronym> 盘的方式来间接提高性能．</p>
<p>当然, mod_gzip 到也不是一无是处, 对于预压缩的文件, 还是有好处的. 而且, 采用压缩的时候,也要注意策略. 图片文件压缩就没什么必要了(Flickr 上图像多, 而且压缩得不到什么好处). Flickr 只对 JavaScript 和 <acronym title="Cascading Style Sheets">CSS</acronym> 进行压缩. mod_gzip 新一点的版本能够自动通过配置 mod_gzip_update_static 选项自动处理 预压缩的文件. Cal 也指出这个特性在一些旧版本的浏览器上会出问题.</p>
<p>压缩的另一个主要手段是内容的压缩. 针对 JavaScript 可以进行通过减少注释、合并空格、使用紧凑的语法等小技巧(Google 的所有脚本都非常难读，而且非常紧凑，思想类似).当然，经过这样处理的 JavaScript 可能带了很多括号不容易解析，<a href="http://www.flickr.com/">Flickr</a> 使用了 <a href="http://dojotoolkit.org/docs/compressor_system.html">Dojo Compressor</a> 来构建解析树。Dojo Compressor 开销很低，而且对于最终用户是透明的. JavaScript 的处理方法介绍过，CSS 处理则相对简单.通过简单的正则表达式替换(比如把多个空格替换为一个空格符), 最高可以获得 50% 的压缩比。</p>
<p><strong>Caching 的优化</strong> <a href="http://www.flickr.com/">Flickr</a> 的开发者充分利用了 Http 1.1 规范定义的 <a href="http://www.dbanotes.net/web/http_11_etag_lastmodified.html">Etag 与 Last-Modified 机制</a> 来提高 Caching 的效率. 值得注意的是，Cal 介绍了一个在负载均衡条件下的 e-Tag 小技巧. 即可以设定 Apache 通过文件调整时间与文件大小获得 E-Tag ,而默认情况下, Apache 是通过文件节点获取 e-Tag 的。当然，这也不是很完美，因为会影响 if-modified-since 。</p>
<p><strong>灵活运用 mod_rewrite</strong> 据说 <a href="http://www.flickr.com/">Flickr</a> 网站应用是进行每日构建的(Daily Build)。 如果没有一个灵活的机制恐怕这是不可想象的。而且，在 Flickr 这样的站点, 内容的修改同步的处理都是很让人头疼的难题. 他们的利器是 <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a> 的灵活运用。通过配置 <acronym title="Unified Resource Locator">URL</acronym> 重写规则，很容易切换到不同的环境下。听起来很简单, 但是没有一定的 Web 技术功力谈何容易做到 ?!</p>
<p>通过这几个主要方法的运用，我们看到了如梦幻一般高性能的 <a href="http://www.flickr.com/">Flickr</a> .</p>
<p><acronym title="By The Way">BTW</acronym>: 因为在 Flickr 在国内没有服务器, 大陆用户访问的速度就别提了 <img src='http://observerlife.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>&#8211;End.</p>
</div>
</div>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://observerlife.com/msn%e5%8e%bb%e5%b9%bf%e5%91%8a%e8%a1%a5%e4%b8%81%e6%94%af%e6%8c%818-0beta/" rel="bookmark" class="crp_title">MSN去广告补丁(支持8.0Beta)</a></li><li><a href="http://observerlife.com/%e8%bd%ac%e8%bd%bd%e6%96%b0%e7%89%88gtd%e6%b5%81%e7%a8%8b%e5%9b%be-%e4%b8%ad%e6%96%87-%e9%9d%9e%e5%b8%b8%e7%b2%be%e5%bd%a9/" rel="bookmark" class="crp_title">[转载]新版GTD流程图-中文-非常精彩</a></li><li><a href="http://observerlife.com/%e6%94%b6%e8%8e%b7%e4%b8%80%e7%94%9f%e5%ad%a6%e4%b9%a0%e4%b9%a0%e6%83%af%e7%9a%8415%e4%b8%aa%e6%ad%a5%e9%aa%a4/" rel="bookmark" class="crp_title">收获一生学习习惯的15个步骤</a></li><li><a href="http://observerlife.com/php%e9%87%8c%e7%9a%84%e6%96%87%e4%bb%b6%e7%8a%b6%e6%80%81%e7%bc%93%e5%ad%98/" rel="bookmark" class="crp_title">PHP里的文件状态缓存</a></li><li><a href="http://observerlife.com/%e4%bb%8a%e6%97%a5%e9%98%85%e8%af%bb%ef%bc%9a%e6%80%a7%e8%83%bd%e6%89%a9%e5%b1%95%e9%97%ae%e9%a2%98%e8%a6%81%e8%b6%81%e6%97%a9/" rel="bookmark" class="crp_title">今日阅读：性能扩展问题要趁早</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://observerlife.com/flickr-%e7%9a%84%e5%bc%80%e5%8f%91%e8%80%85%e7%9a%84-web-%e5%ba%94%e7%94%a8%e4%bc%98%e5%8c%96%e6%8a%80%e5%b7%a7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
