﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-大牛的快乐生活-文章分类-互联网</title><link>http://www.blogjava.net/hongbo678/category/7151.html</link><description>生活，充满无穷的乐趣。</description><language>zh-cn</language><lastBuildDate>Fri, 18 May 2007 03:26:16 GMT</lastBuildDate><pubDate>Fri, 18 May 2007 03:26:16 GMT</pubDate><ttl>60</ttl><item><title>mysql数据库优化参数</title><link>http://www.blogjava.net/hongbo678/articles/118076.html</link><dc:creator>大牛</dc:creator><author>大牛</author><pubDate>Thu, 17 May 2007 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/hongbo678/articles/118076.html</guid><wfw:comment>http://www.blogjava.net/hongbo678/comments/118076.html</wfw:comment><comments>http://www.blogjava.net/hongbo678/articles/118076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hongbo678/comments/commentRss/118076.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hongbo678/services/trackbacks/118076.html</trackback:ping><description><![CDATA[key_buffer_size,query_cache_size,table_cache三个参数比较重要<br>
<p>key_buffer_size只对MyISAM表起作用，</p>
<p>key_buffer_size指定索引缓冲区的大小，它决定索引处理的速度，尤其是索引读的速度。一般我们设为16M,实际上稍微大一点的站点　这个数字是远远不够的，通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好（上述状态值可以使用SHOW STATUS LIKE &#8216;key_read%&#8217;获得）。 或者如果你装了phpmyadmin 可以通过服务器运行状态看到,笔者推荐用phpmyadmin管理mysql，以下的状态值都是本人通过phpmyadmin获得的实例分析: </p>
<p>这个服务器已经运行了20天 <br>key_buffer_size &#8211; 128M <br>key_read_requests &#8211; 650759289 <br>key_reads - 79112 <br>比例接近1:8000 健康状况非常好 </p>
<p>另外一个估计key_buffer_size的办法　把你网站<a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target=_self><u><strong><font color=#0000ff>数据库</font></strong></u></a>的每个表的索引所占空间大小加起来看看以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大。</p>
<p>从4.0.1开始，MySQL提供了查询缓冲机制。使用查询缓冲，MySQL将SELECT语句和查询结果存放在缓冲区中，今后对于同样的SELECT语句（区分大小写），将直接从缓冲区中读取结果。根据MySQL用户手册，使用查询缓冲最多可以达到238%的效率。</p>
<p>通过调节以下几个参数可以知道query_cache_size设置得是否合理 <br>Qcache inserts <br>Qcache hits <br>Qcache lowmem prunes <br>Qcache free blocks <br>Qcache total blocks </p>
<p>Qcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况,同时Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，此时需要增加缓冲大小Qcache_hits的值不大，则表明你的查询重复率很低，这种情况下使用查询缓冲反而会影响效率，那么可以考虑不用查询缓冲。此外，在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。<br>Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多query_cache_type指定是否使用查询缓冲</p>
<p>我设置: <br>query_cache_size = 32M <br>query_cache_type= 1 <br>得到如下状态值: <br>Qcache queries in cache 12737 表明目前缓存的条数 <br>Qcache inserts 20649006 <br>Qcache hits 79060095 　看来重复查询率还挺高的 <br>Qcache lowmem prunes 617913　有这么多次出现缓存过低的情况 <br>Qcache not cached 189896 　　 <br>Qcache free memory 18573912　　目前剩余缓存空间 <br>Qcache free blocks 5328 这个数字似乎有点大　碎片不少 <br>Qcache total blocks 30953 <br>如果内存允许32M应该要往上加点</p>
<p>table_cache指定表高速缓存的大小。每当MySQL访问一个表时，如果在表缓冲区中还有空间，该表就被打开并放入其中，这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables，可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache，并且opened_tables在不断增长，那么你就需要增加table_cache的值了（上述状态值可以使用SHOW STATUS LIKE &#8216;Open%tables&#8217;获得）。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。</p>
<p>对于有1G内存的机器，推荐值是128－256。 </p>
<p>笔者设置table_cache = 256 <br>得到以下状态: <br>Open tables 256 <br>Opened tables 9046 <br>虽然open_tables已经等于table_cache，但是相对于服务器运行时间来说,已经运行了20天，opened_tables的值也非常低。因此，增加table_cache的值应该用处不大。如果运行了6个小时就出现上述值 那就要考虑增大table_cache。</p>
<p>如果你不需要记录2进制log 就把这个功能关掉，注意关掉以后就不能恢复出问题前的数据了，需要您手动备份，二进制<a onclick="javascript:tagshow(event, '%C8%D5%D6%BE');" href="javascript:;" target=_self><u><strong><font color=#0000ff>日志</font></strong></u></a>包含所有更新数据的语句，其目的是在恢复数据库时用它来把数据尽可能恢复到最后的状态。另外，如果做同步复制( Replication )的话，也需要使用二进制日志传送修改情况。<br><br>log_bin指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。MySQL会在文件名后面自动添加数字引，每次启动服务时，都会重新生成一个新的二进制文件。此外，使用log-bin-index可以指定索引文件；使用binlog-do-db可以指定记录的数据库；使用binlog-ignore-db可以指定不记录的数据库。注意的是：binlog-do-db和binlog-ignore-db一次只指定一个数据库，指定多个数据库需要多个语句。而且，MySQL会将所有的数据库名称改成小写，在指定数据库时必须全部使用小写名字，否则不会起作用。 <br><br>关掉这个功能只需要在他前面加上#号 <br>#log-bin</p>
<p>开启慢查询日志( slow query log ) <br><br>慢查询日志对于跟踪有问题的查询非常有用。它记录所有查过long_query_time的查询，如果需要，还可以记录不使用索引的记录。下面是一个慢查询日志的例子：</p>
<p>开启慢查询日志，需要设置参数log_slow_queries、long_query_times、log-queries-not-using-indexes。</p>
<p>log_slow_queries指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。long_query_times指定慢查询的阈值，缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的参数，它指示记录不使用索引的查询。笔者设置long_query_time=10 </p>
<p>笔者设置: <br>sort_buffer_size = 1M <br>max_connections=120 <br>wait_timeout =120 <br>back_log=100 <br>read_buffer_size = 1M <br>thread_cache=32 <br>interactive_timeout=120 <br>thread_concurrency = 4 </p>
<p>参数说明: <br>back_log <br>要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 Unix listen(2)系统调用的手册页应该有更多的细节。检查你的OS文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效的。<br>max_connections <br>并发连接数目最大，120 超过这个值就会自动恢复，出了问题能自动解决<br><br>thread_cache <br>没找到具体说明，不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的 <br><br>thread_concurrency<br>#设置为你的cpu数目x2,例如，只有一个cpu,那么thread_concurrency=2 <br>#有2个cpu,那么thread_concurrency=4 <br><br>skip-innodb <br>#去掉innodb支持<br></p>
<img src ="http://www.blogjava.net/hongbo678/aggbug/118076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hongbo678/" target="_blank">大牛</a> 2007-05-17 14:28 <a href="http://www.blogjava.net/hongbo678/articles/118076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>