<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[我的mysql 优化日记]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Tue, 29 Dec 2009 05:39:48 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法，因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。<br/><br/>安装好mysql后，配制文件应该在/usr/local/mysql/share/mysql目录中，配制文件有几个，有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境，当然需要有不同的配制文件了。<br/><br/>一般的情况下，my-medium.cnf这个配制文件就能满足我们的大多需要；一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了，使用mysqladmin variables extended-status –u root –p 可以看到目前的参数，有３个配置参数是最重要的，即key_buffer_size,query_cache_size,table_cache。<br/><br/>key_buffer_size只对MyISAM表起作用，<br/><br/>key_buffer_size指定索引缓冲区的大小，它决定索引处理的速度，尤其是索引读的速度。一般我们设为16M,实际上稍微大一点的站点　这个数字是远远不够的，通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好（上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得）。 或者如果你装了phpmyadmin 可以通过服务器运行状态看到,笔者推荐用phpmyadmin管理mysql，以下的状态值都是本人通过phpmyadmin获得的实例分析:<br/><br/>这个服务器已经运行了20天<br/><br/>key_buffer_size – 128M<br/>key_read_requests – 650759289<br/>key_reads - 79112比例接近1:8000 健康状况非常好<br/><br/>另外一个估计key_buffer_size的办法　把你网站数据库的每个表的索引所占空间大小加起来看看以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大。<br/><br/>从4.0.1开始，MySQL提供了查询缓冲机制。使用查询缓冲，MySQL将SELECT语句和查询结果存放在缓冲区中，今后对于同样的SELECT语句（区分大小写），将直接从缓冲区中读取结果。根据MySQL用户手册，使用查询缓冲最多可以达到238%的效率。<br/><br/>通过调节以下几个参数可以知道query_cache_size设置得是否合理<br/><br/>Qcache inserts<br/>Qcache hits<br/>Qcache lowmem prunes<br/>Qcache free blocks<br/>Qcache total blocksQcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况,同时Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，此时需要增加缓冲大小Qcache_hits的值不大，则表明你的查询重复率很低，这种情况下使用查询缓冲反而会影响效率，那么可以考虑不用查询缓冲。此外，在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。<br/><br/>Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多query_cache_type指定是否使用查询缓冲<br/><br/>我设置:<br/><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如果内存允许32M应该要往上加点<br/><br/>table_cache指定表高速缓存的大小。每当MySQL访问一个表时，如果在表缓冲区中还有空间，该表就被打开并放入其中，这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables，可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache，并且opened_tables在不断增长，那么你就需要增加table_cache的值了（上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得）。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。<br/><br/>对于有1G内存的机器，推荐值是128－256。<br/><br/>笔者设置table_cache = 256<br/><br/>得到以下状态:<br/><br/>Open tables 256<br/>Opened tables 9046虽然open_tables已经等于table_cache，但是相对于服务器运行时间来说,已经运行了20天，opened_tables的值也非常低。因此，增加table_cache的值应该用处不大。如果运行了6个小时就出现上述值 那就要考虑增大table_cache。<br/><br/>如果你不需要记录2进制log 就把这个功能关掉，注意关掉以后就不能恢复出问题前的数据了，需要您手动备份，二进制日志包含所有更新数据的语句，其目的是在恢复数据库时用它来把数据尽可能恢复到最后的状态。另外，如果做同步复制( 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/><br/>#log-bin开启慢查询日志( slow query log ) 慢查询日志对于跟踪有问题的查询非常有用。它记录所有查过long_query_time的查询，如果需要，还可以记录不使用索引的记录。下面是一个慢查询日志的例子：<br/><br/>开启慢查询日志，需要设置参数log_slow_queries、long_query_times、log-queries-not-using-indexes。<br/><br/>log_slow_queries指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。long_query_times指定慢查询的阈值，缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的参数，它指示记录不使用索引的查询。笔者设置long_query_time=10<br/><br/>笔者设置:<br/><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参数说明:<br/><br/>back_log<br/><br/>要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 Unix listen(2)系统调用的手册页应该有更多的细节。检查你的OS文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效的。<br/><br/>max_connections<br/><br/>并发连接数目最大，120 超过这个值就会自动恢复，出了问题能自动解决<br/><br/>thread_cache<br/><br/>没找到具体说明，不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的<br/><br/>thread_concurrency<br/><br/>#设置为你的cpu数目x2,例如，只有一个cpu,那么thread_concurrency=2<br/>#有2个cpu,那么thread_concurrency=4<br/>skip-innodb<br/>#去掉innodb支持代码:<br/><br/># Example MySQL config file for medium systems.<br/>#<br/># This is for a system with little memory (32M - 64M) where MySQL plays<br/># an important part, or systems up to 128M where MySQL is used together with<br/># other programs (such as a web server)<br/>#<br/># You can copy this file to<br/># /etc/my.cnf to set global options,<br/># mysql-data-dir/my.cnf to set server-specific options (in this<br/># installation this directory is /var/lib/mysql) or<br/># ~/.my.cnf to set user-specific options.<br/>#<br/># In this file, you can use all long options that a program supports.<br/># If you want to know which options a program supports, run the program<br/># with the "--help" option. <br/><br/># The following options will be passed to all MySQL clients<br/>[client]<br/>#password = your_password<br/>port = 3306<br/>socket = /tmp/mysql.sock<br/>#socket = /var/lib/mysql/mysql.sock<br/># Here follows entries for some specific programs <br/><br/># The MySQL server<br/>[mysqld]<br/>port = 3306<br/>socket = /tmp/mysql.sock<br/>#socket = /var/lib/mysql/mysql.sock<br/>skip-locking<br/>key_buffer = 128M<br/>max_allowed_packet = 1M<br/>table_cache = 256<br/>sort_buffer_size = 1M<br/>net_buffer_length = 16K<br/>myisam_sort_buffer_size = 1M<br/>max_connections=120<br/>#addnew config<br/>wait_timeout =120<br/>back_log=100<br/>read_buffer_size = 1M<br/>thread_cache=32<br/>skip-innodb<br/>skip-bdb<br/>skip-name-resolve<br/>join_buffer_size=512k<br/>query_cache_size = 32M<br/>interactive_timeout=120<br/>long_query_time=10<br/>log_slow_queries= /usr/local/mysql4/logs/slow_query.log<br/>query_cache_type= 1<br/># Try number of CPU's*2 for thread_concurrency<br/>thread_concurrency = 4 <br/><br/>#end new config<br/># Don't listen on a TCP/IP port at all. This can be a security enhancement,<br/># if all processes that need to connect to mysqld run on the same host.<br/># All interaction with mysqld must be made via Unix sockets or named pipes.<br/># Note that using this option without enabling named pipes on Windows<br/># (via the "enable-named-pipe" option) will render mysqld useless!<br/>#<br/>#skip-networking <br/><br/># Replication Master Server (default)<br/># binary logging is required for replication<br/>#log-bin <br/><br/># required unique id between 1 and 2^32 - 1<br/># defaults to 1 if master-host is not set<br/># but will not function as a master if omitted<br/>server-id = 1 <br/><br/># Replication Slave (comment out master section to use this)<br/>#<br/># To configure this host as a replication slave, you can choose between<br/># two methods :<br/>#<br/># 1) Use the CHANGE MASTER TO command (fully described in our manual) -<br/># the syntax is:<br/>#<br/># CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,<br/># MASTER_USER=, MASTER_PASSWORD= ;<br/>#<br/># where you replace , , by quoted strings and<br/># by the master's port number (3306 by default).<br/>#<br/># Example:<br/>#<br/># CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,<br/># MASTER_USER='joe', MASTER_PASSWORD='secret';<br/>#<br/># OR<br/>#<br/># 2) Set the variables below. However, in case you choose this method, then<br/># start replication for the first time (even unsuccessfully, for example<br/># if you mistyped the password in master-password and the slave fails to<br/># connect), the slave will create a master.info file, and any later<br/># change in this file to the variables' values below will be ignored and<br/># overridden by the content of the master.info file, unless you shutdown<br/># the slave server, delete master.info and restart the slaver server.<br/># For that reason, you may want to leave the lines below untouched<br/># (commented) and instead use CHANGE MASTER TO (see above)<br/>#<br/># required unique id between 2 and 2^32 - 1<br/># (and different from the master)<br/># defaults to 2 if master-host is set<br/># but will not function as a slave if omitted<br/>#server-id = 2<br/>#<br/># The replication master for this slave - required<br/>#master-host =<br/>#<br/># The username the slave will use for authentication when connecting<br/># to the master - required<br/>#master-user =<br/>#<br/># The password the slave will authenticate with when connecting to<br/># the master - required<br/>#master-password =<br/>#<br/># The port the master is listening on.<br/># optional - defaults to 3306<br/>#master-port =<br/>#<br/># binary logging - not required for slaves, but recommended<br/>#log-bin <br/><br/># Point the following paths to different dedicated disks<br/>#tmpdir = /tmp/<br/>#log-update = /path-to-dedicated-directory/hostname <br/><br/># Uncomment the following if you are using BDB tables<br/>#bdb_cache_size = 4M<br/>#bdb_max_lock = 10000 <br/><br/># Uncomment the following if you are using InnoDB tables<br/>#innodb_data_home_dir = /var/lib/mysql/<br/>#innodb_data_file_path = ibdata1:10M:autoextend<br/>#innodb_log_group_home_dir = /var/lib/mysql/<br/>#innodb_log_arch_dir = /var/lib/mysql/<br/># You can set .._buffer_pool_size up to 50 - 80 %<br/># of RAM but beware of setting memory usage too high<br/>#innodb_buffer_pool_size = 16M<br/>#innodb_additional_mem_pool_size = 2M<br/># Set .._log_file_size to 25 % of buffer pool size<br/>#innodb_log_file_size = 5M<br/>#innodb_log_buffer_size = 8M<br/>#innodb_flush_log_at_trx_commit = 1<br/>#innodb_lock_wait_timeout = 50 <br/><br/>[mysqldump]<br/>quick<br/>max_allowed_packet = 16M <br/><br/>[mysql]<br/>no-auto-rehash<br/># Remove the next comment character if you are not familiar with SQL<br/>#safe-updates <br/><br/>[isamchk]<br/>key_buffer = 20M<br/>sort_buffer_size = 20M<br/>read_buffer = 2M<br/>write_buffer = 2M <br/><br/>[myisamchk]<br/>key_buffer = 20M<br/>sort_buffer_size = 20M<br/>read_buffer = 2M<br/>write_buffer = 2M <br/><br/>[mysqlhotcopy]<br/>interactive-timeout补充<br/><br/>优化table_cachetable_cache指定表高速缓存的大小。每当MySQL访问一个表时，如果在表缓冲区中还有空间，该表就被打开并放入其中，这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables，可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache，并且opened_tables在不断增长，那么你就需要增加table_cache的值了（上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得）。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。对于有1G内存的机器，推荐值是128－256。<br/><br/>案例1：该案例来自一个不是特别繁忙的服务器table_cache – 512open_tables – 103opened_tables – 1273uptime – 4021421 (measured in seconds)该案例中table_cache似乎设置得太高了。在峰值时间，打开表的数目比table_cache要少得多。<br/><br/>案例2：该案例来自一台开发服务器。table_cache – 64open_tables – 64opened-tables – 431uptime – 1662790 (measured in seconds)虽然open_tables已经等于table_cache，但是相对于服务器运行时间来说，opened_tables的值也非常低。因此，增加table_cache的值应该用处不大。案例3：该案例来自一个upderperforming的服务器table_cache – 64open_tables – 64opened_tables – 22423uptime – 19538该案例中table_cache设置得太低了。虽然运行时间不到6小时，open_tables达到了最大值，opened_tables的值也非常高。这样就需要增加table_cache的值。优化key_buffer_sizekey_buffer_size指定索引缓冲区的大小，它决定索引处理的速度，尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads，可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好（上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得）。key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表，但是内部的临时磁盘表是MyISAM表，也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。对于1G内存的机器，如果不使用MyISAM表，推荐值是16M（8-64M）。<br/><br/>案例1：健康状况key_buffer_size – 402649088 (384M)key_read_requests – 597579931key_reads - 56188案例2：警报状态key_buffer_size – 16777216 (16M)key_read_requests – 597579931key_reads - 53832731案例1中比例低于1:10000，是健康的情况；案例2中比例达到1:11，警报已经拉响。<br/><br/> <br/><br/>1)、back_log： 要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。 <br/><br/>back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。 当你观察你的主机进程列表，发现大量 264084 &#124; unauthenticated user &#124; xxx.xxx.xxx.xxx &#124; NULL &#124; Connect &#124; NULL &#124; login &#124; NULL 的待连接进程时，就要加大 back_log 的值了。默认数值是50，我把它改为500。 <br/><br/> <br/><br/>(2)、interactive_timeout： 服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800，我把它改为7200。 <br/><br/> <br/><br/>(3)、key_buffer_size： 索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小，增加它可得到更好处理的索引(对所有读和多重写)，到你能负担得起那样多。如果你使它太大，系统将开始换页并且真的变慢了。默认数值是8388600(8M)，我的MySQL主机有2GB内存，所以我把它改为402649088(400MB)。 <br/><br/> <br/><br/>(4)、max_connections： 允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加，否则，你将经常看到 Too many connections 错误。 默认数值是100，我把它改为1024 。 <br/><br/> <br/><br/>(5)、record_buffer： 每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描，你可能想要增加该值。默认数值是131072(128K)，我把它改为16773120 (16M) <br/><br/> <br/><br/>(6)、sort_buffer： 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M)，我把它改为 16777208 (16M)。 <br/><br/> <br/><br/>(7)、table_cache： 为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64，我把它改为512。 <br/><br/> <br/><br/>(、thread_cache_size： 可以复用的保存在中的线程的数量。如果有，新的线程从缓存中取得，当断开连接的时候如果有空间，客户的线置在缓存中。如果有很多新的线程，为了提高性能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量，可以看到这个变量的作用。我把它设置为 80。 <br/><br/> <br/><br/>(10)、wait_timeout： 服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800，我把它改为7200。 注：参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。这是一个比较谨慎的工作，上面的结果也仅仅是我的一些看法，你可以根据你自己主机的硬件情况（特别是内存大小）进一步修改。<br/><br/> <br/><br/>我从网上找到的，我刚看了一下，还算不错，发在这里，大家看看，最好有牛人补充完善然后，再整理整理！<br/><br/> <br/><br/>========================================在Apache, PHP, MySQL的体系架构中，MySQL对于性能的影响最大，也是关键的核心部分。对于Discuz!论坛程序也是如此，MySQL的设置是否合理优化，直接影响到论坛的速度和承载量！同时，MySQL也是优化难度最大的一个部分，不但需要理解一些MySQL专业知识，同时还需要长时间的观察统计并且根据经验进行判断，然后设置合理的参数。 下面我们了解一下MySQL优化的一些基础，MySQL的优化我分为两个部分，一是服务器物理硬件的优化；二是MySQL自身(my.cnf)的优化。<br/><br/> <br/><br/>(1) 服务器硬件对MySQL性能的影响 <br/><br/>a) 磁盘寻道能力（磁盘I/O）,以目前高转速SCSI硬盘(7200转/秒)为例，这种硬盘理论上每秒寻道7200次，这是物理特性决定的，没有办法改变。MySQL每秒钟都在进行大量、复杂的查询操作，对磁盘的读写量可想而知。所以，通常认为磁盘I/O是制约MySQL性能的最大因素之一，对于日均访问量在100万PV以上的Discuz!论坛，由于磁盘I/O的制约，MySQL的性能会非常低下！解决这一制约因素可以考虑以下几种解决方案： 使用RAID-0+1磁盘阵列，注意不要尝试使用RAID-5，MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快； 抛弃传统的硬盘，使用速度更快的闪存式存储设备。经过Discuz!公司技术工程的测试，使用闪存式存储设备可比传统硬盘速度高出6－10倍左右。 <br/><br/>b) CPU 对于MySQL应用，推荐使用S.M.P.架构的多路对称CPU，例如：可以使用两颗Intel Xeon 3.6GHz的CPU。 <br/><br/>c) 物理内存对于一台使用MySQL的Database Server来说，服务器内存建议不要小于2GB，推荐使用4GB以上的物理内存。<br/><br/> <br/><br/>(2) MySQL自身因素当解决了上述服务器硬件制约因素后，让我们看看MySQL自身的优化是如何操作的。对MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。 由于my.cnf文件的优化设置是与服务器硬件配置息息相关的，因而我们指定一个假想的服务器硬件环境： <br/><br/>CPU: 2颗Intel Xeon 2.4GHz 内存: 4GB DDR 硬盘: SCSI 73GB <br/><br/>下面，我们根据以上硬件配置结合一份已经优化好的my.cnf进行说明： <br/><br/># vi /etc/my.cnf以下只列出my.cnf文件中[mysqld]段落中的内容，其他段落内容对MySQL运行性能影响甚微，因而姑且忽略。 <br/><br/>[mysqld]<br/><br/>port = 3306<br/><br/>serverid = 1 <br/><br/>socket = /tmp/mysql.sock<br/><br/>skip-locking<br/><br/># 避免MySQL的外部锁定，减少出错几率增强稳定性。<br/><br/>skip-name-resolve禁止MySQL对外部连接进行DNS解析，使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意，如果开启该选项，则所有远程主机连接授权都要使用IP地址方式，否则MySQL将无法正常处理连接请求！ <br/><br/> <br/><br/> <br/><br/> <br/><br/>back_log = 384指定MySQL可能的连接数量。当MySQL主线程在很短的时间内接收到非常多的连接请求，该参数生效，主线程花费很短的时间检查连接并且启动一个新线程。 <br/><br/>back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 如果系统在一个短时间内有很多连接，则需要增大该参数的值，该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。<br/><br/> <br/><br/> <br/><br/>key_buffer_size = 256M<br/><br/># key_buffer_size指定用于索引的缓冲区大小，增加它可得到更好的索引处理性能。对于内存在4GB左右的服务器该参数可设置为256M或384M。注意：该参数值设置的过大反而会是服务器整体效率降低！ <br/><br/>max_allowed_packet = 4M<br/><br/>thread_stack = 256K<br/><br/>table_cache = 128K<br/><br/>sort_buffer_size = 6M查询排序时所能使用的缓冲区大小。注意：该参数对应的分配内存是每连接独占！如果有100个连接，那么实际分配的总共排序缓冲区大小为100 × 6 ＝ 600MB。所以，对于内存在4GB左右的服务器推荐设置为6-8M。<br/><br/> <br/><br/> <br/><br/>read_buffer_size = 4M读查询操作所能使用的缓冲区大小。和sort_buffer_size一样，该参数对应的分配内存也是每连接独享！<br/><br/> <br/><br/> <br/><br/>join_buffer_size = 8M联合查询操作所能使用的缓冲区大小，和sort_buffer_size一样，该参数对应的分配内存也是每连接独享！<br/><br/> <br/><br/> <br/><br/>myisam_sort_buffer_size = 64M<br/><br/>table_cache = 512<br/><br/>thread_cache_size = 64<br/><br/>query_cache_size = 64M指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察： <br/><br/># > SHOW VARIABLES LIKE ‘%query_cache%’;<br/><br/># > SHOW STATUS LIKE ‘Qcache%’;<br/><br/># 如果Qcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况；如果Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，如果该值较小反而会影响效率，那么可以考虑不用查询缓冲；Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多。<br/><br/> <br/><br/> <br/><br/>tmp_table_size = 256M<br/><br/>max_connections = 768指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示，则需要增大该参数值。<br/><br/> <br/><br/> <br/><br/>max_connect_errors = 10000000<br/><br/>wait_timeout = 10指定一个请求的最大连接时间，对于4GB左右内存的服务器可以设置为5-10。<br/><br/> <br/><br/> <br/><br/>thread_concurrency = 8该参数取值为服务器逻辑CPU数量×2，在本例中，服务器有2颗物理CPU，而每颗物理CPU又支持H.T超线程，所以实际取值为4 × 2 ＝ 8<br/><br/> <br/><br/> <br/>
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 我的mysql 优化日记]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>