同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。

安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境,当然需要有不同的配制文件了。

一般的情况下,my-medium.cnf这个配制文件就能满足我们的大多需要;一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了,使用mysqladmin variables extended-status –u root –p 可以看到目前的参数,有3个配置参数是最重要的,即key_buffer_size,query_cache_size,table_cache。

key_buffer_size只对MyISAM表起作用,

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获得的实例分析:

这个服务器已经运行了20天

key_buffer_size – 128M 
key_read_requests – 650759289 
key_reads - 79112

比例接近1:8000 健康状况非常好

另外一个估计key_buffer_size的办法 把你网站数据库的每个表的索引所占空间大小加起来看看以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大。

从4.0.1开始,MySQL提供了查询缓冲机制。使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。

通过调节以下几个参数可以知道query_cache_size设置得是否合理

Qcache inserts 
Qcache hits 
Qcache lowmem prunes 
Qcache free blocks 
Qcache total blocks

Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,同时Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。

Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多query_cache_type指定是否使用查询缓冲

我设置:

query_cache_size = 32M 
query_cache_type= 1

得到如下状态值:

Qcache queries in cache 12737 表明目前缓存的条数 
Qcache inserts 20649006 
Qcache hits 79060095  看来重复查询率还挺高的 
Qcache lowmem prunes 617913 有这么多次出现缓存过低的情况 
Qcache not cached 189896    
Qcache free memory 18573912  目前剩余缓存空间 
Qcache free blocks 5328 这个数字似乎有点大 碎片不少 
Qcache total blocks 30953

如果内存允许32M应该要往上加点

table_cache指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

第二篇

 

下面MyISAM的参数是MySQL手册推荐的参数,据说适应于大部分情况。
1.获取当前配置参数
要优化配置参数,首先要了解当前的配置参数以及运行情况。使用下列命令可以获得目前服务器使用的配置参数:
mysqld –verbose –help
mysqladmin variables extended-status –u root –p
在MySQL控制台里面,运行下列命令可以获取状态变量的值:
mysql> SHOW STATUS;
如果只要检查某几个状态变量,可以使用下列命令:
mysql> SHOW STATUS LIKE ‘[匹配模式]’; ( 可以使用%、?等 )

2.优化参数

参数优化基于一个前提,就是在我们的数据库中通常都使用InnoDB表,而不使用MyISAM表。在优化MySQL时,有两个配置参数是最重要的,即table_cache和key_buffer_size。
table_cache
table_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。
案例1:该案例来自一个不是特别繁忙的服务器


table_cache – 512
open_tables – 103
opened_tables – 1273
uptime – 4021421 (measured in seconds)
该案例中table_cache似乎设置得太高了。在峰值时间,打开表的数目比table_cache要少得多。

案例2:该案例来自一台开发服务器。


table_cache – 64
open_tables – 64
opened-tables – 431
uptime – 1662790 (measured in seconds)
虽然open_tables已经等于table_cache,但是相对于服务器运行时间来说,opened_tables的值也非常低。因此,增加table_cache的值应该用处不大。

案例3:该案例来自一个upderperforming的服务器


table_cache – 64
open_tables – 64
opened_tables – 22423
uptime – 19538
该案例中table_cache设置得太低了。虽然运行时间不到6小时,open_tables达到了最大值,opened_tables的值也非常高。这样就需要增加table_cache的值。

key_buffer_size


key_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)。

 

 第三篇

 

XML/HTML代码
  1. 你能用这个命令得到mysqld服务器缺省缓冲区大小:   
  2.   
  3. shell> mysqld --help   
  4.   
  5. 这个命令生成一张所有mysqld选项和可配置变量的表。输出包括缺省值并且看上去象这样一些东西:   
  6.   
  7. Possible variables for option --set-variable (-O) are:   
  8. back_log              current value: 5   
  9. connect_timeout       current value: 5   
  10. delayed_insert_timeout current value: 300   
  11. delayed_insert_limit current value: 100   
  12. delayed_queue_size    current value: 1000   
  13. flush_time            current value: 0   
  14. interactive_timeout   current value: 28800   
  15. join_buffer_size      current value: 131072   
  16. key_buffer_size       current value: 1048540   
  17. lower_case_table_names current value: 0   
  18. long_query_time       current value: 10   
  19. max_allowed_packet    current value: 1048576   
  20. max_connections       current value: 100   
  21. max_connect_errors    current value: 10   
  22. max_delayed_threads   current value: 20   
  23. max_heap_table_size   current value: 16777216   
  24. max_join_size         current value: 4294967295   
  25. max_sort_length       current value: 1024   
  26. max_tmp_tables        current value: 32   
  27. max_write_lock_count current value: 4294967295   
  28. net_buffer_length     current value: 16384   
  29. query_buffer_size     current value: 0   
  30. record_buffer         current value: 131072   
  31. sort_buffer           current value: 2097116   
  32. table_cache           current value: 64   
  33. thread_concurrency    current value: 10   
  34. tmp_table_size        current value: 1048576   
  35. thread_stack          current value: 131072   
  36. wait_timeout          current value: 28800   
  37.   
  38. 如果有一个mysqld服务器正在运行,通过执行这个命令,你可以看到它实际上使用的变量的值:   
  39.   
  40. shell> mysqladmin variables   
  41.   
  42. 每个选项在下面描述。对于缓冲区大小、长度和栈大小的值以字节给出,你能用于个后缀“K”或“M” 指出以K字节或兆字节显示值。例如,16M指出16兆字节。后缀字母的大小写没有关系;16M和16m是相同的。   
  43.   
  44. 你也可以用命令SHOW STATUS自一个运行的服务器看见一些统计。见7.21 SHOW语法(得到表、列的信息)。   
  45.   
  46. back_log   
  47. 要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些 时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如 果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限 制。 Unix listen(2)系统调用的手册页应该有更多的细节。检查你的OS文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效 的。   
  48. connect_timeout   
  49. mysqld服务器在用Bad handshake(糟糕的握手)应答前正在等待一个连接报文的秒数。   
  50. delayed_insert_timeout   
  51. 一个INSERT DELAYED线程应该在终止之前等待INSERT语句的时间。   
  52. delayed_insert_limit   
  53. 在插入delayed_insert_limit行后,INSERT DELAYED处理器将检查是否有任何SELECT语句未执行。如果这样,在继续前执行允许这些语句。   
  54. delayed_queue_size   
  55. 应该为处理INSERT DELAYED分配多大一个队列(以行数)。如果排队满了,任何进行INSERT DELAYED的客户将等待直到队列又有空间了。   
  56. flush_time   
  57. 如果这被设置为非零值,那么每flush_time秒所有表将被关闭(以释放资源和sync到磁盘)。   
  58. interactive_timeout   
  59. 服务器在关上它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对mysql_real_connect()使用CLIENT_INTERACTIVE选项的客户。也可见wait_timeout。   
  60. join_buffer_size   
  61. 用于全部联结(join)的缓冲区大小(不是用索引的联结)。缓冲区对2个表间的每个全部联结分配一次缓冲区,当增加索引不可能时,增加该值可得到一个更快的全部联结。(通常得到快速联结的最佳方法是增加索引。)   
  62. key_buffer_size   
  63. 索 引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能 负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。记住既然MySQL不缓存读取的数据,你将必须为OS文件系统缓存留下一些空间。为了在 写入多个行时得到更多的速度,使用LOCK TABLES。见7.24LOCK TABLES/UNLOCK TABLES语法。   
  64. long_query_time   
  65. 如果一个查询所用时间超过它(以秒计),Slow_queries记数器将被增加。   
  66. max_allowed_packet   
  67. 一 个包的最大尺寸。消息缓冲区被初始化为net_buffer_length字节,但是可在需要时增加到max_allowed_packet个字节。缺省 地,该值太小必能捕捉大的(可能错误)包。如果你正在使用大的BLOB列,你必须增加该值。它应该象你想要使用的最大BLOB的那么大。   
  68. max_connections   
  69. 允许的同时客户的数量。增加该值增加mysqld要求的文件描述符的数量。见下面对文件描述符限制的注释。见18.2.4 Too many connections错误。   
  70. max_connect_errors   
  71. 如果有多于该数量的从一台主机中断的连接,这台主机阻止进一步的连接。你可用FLUSH HOSTS命令疏通一台主机。   
  72. max_delayed_threads   
  73. 不要启动多于的这个数字的线程来处理INSERT DELAYED语句。如果你试图在所有INSERT DELAYED线程在用后向一张新表插入数据,行将被插入,就像DELAYED属性没被指定那样。   
  74. max_join_size   
  75. 可能将要读入多于max_join_size个记录的联结将返回一个错误。如果你的用户想要执行没有一个WHERE子句、花很长时间并且返回百万行的联结,设置它。   
  76. max_sort_length   
  77. 在排序BLOB或TEXT值时使用的字节数(每个值仅头max_sort_length个字节被使用;其余的被忽略)。   
  78. max_tmp_tables   
  79. (该选择目前还不做任何事情)。一个客户能同时保持打开的临时表的最大数量。   
  80. net_buffer_length   
  81. 通信缓冲区在查询之间被重置到该大小。通常这不应该被改变,但是如果你有很少的内存,你能将它设置为查询期望的大小。(即,客户发出的SQL语句期望的长度。如果语句超过这个长度,缓冲区自动地被扩大,直到max_allowed_packet个字节。)   
  82. record_buffer   
  83. 每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。   
  84. sort_buffer   
  85. 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。见18.5 MySQL在哪儿存储临时文件。   
  86. table_cache   
  87. 为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符,见下面对文件描述符限制的注释。对于表缓存如何工作的信息,见10.2.4 MySQL怎样打开和关闭表。   
  88. tmp_table_size   
  89. 如果一张临时表超出该大小,MySQL产生一个The table tbl_name is full形式的错误,如果你做很多高级GROUP BY查询,增加tmp_table_size值。   
  90. thread_stack   
  91. 每个线程的栈大小。由crash-me测试检测到的许多限制依赖于该值。缺省队一般的操作是足够大了。见10.8 使用你自己的基准。   
  92. wait_timeout   
  93. 服务器在关闭它之前在一个连接上等待行动的秒数。也可见interactive_timeout。   
  94. MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。    
  95. 如果你有很多内存和很多表并且有一个中等数量的客户,想要最大的性能,你应该一些象这样的东西:   
  96.   
  97. shell> safe_mysqld -O key_buffer=16M -O table_cache=128 \   
  98.            -O sort_buffer=4M -O record_buffer=1M &   
  99.   
  100. 如果你有较少的内存和大量的连接,使用这样一些东西:   
  101. shell> safe_mysqld -O key_buffer=512k -O sort_buffer=100k \   
  102.            -O record_buffer=100k &   
  103.   
  104. 或甚至:   
  105. shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k \   
  106.            -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &   
  107.   
  108. 如果有很多连接,“交换问题”可能发生,除非mysqld已经被配置每个连接使用很少的内存。当然如果你对所有连接有足够的内存,mysqld执行得更好。   
  109.   
  110. 注意,如果你改变mysqld的一个选项,它实际上只对服务器的那个例子保持。   
  111.   
  112. 为了明白一个参数变化的效果,这样做:   
  113.   
  114. shell> mysqld -O key_buffer=32m --help   
  115.   
  116. 保证--help选项是最后一个;否则,命令行上在它之后列出的任何选项的效果将不在反映在输出中。   

 第四篇

mysql安装好需要优化配置一下,打开c:\windows\my.ini文件
第一种
QUOTE:
#This File was made using the WinMySQLAdmin 1.4 Tool
#2004-2-23 16:28:14

#Uncomment or Add only the keys that you know how works.
#Read the MySQL Manual for instructions

[mysqld]
basedir=D:/mysql
#bind-address=210.5.*.*
datadir=D:/mysql/data
#language=D:/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
set-variable     = max_connections=1500
skip-locking
#skip-networking
set-variable         = key_buffer=384M
set-variable         = max_allowed_packet=1M
set-variable         = table_cache=512
set-variable         = sort_buffer=2M
set-variable         = record_buffer=2M
set-variable         = thread_cache=8
# Try number of CPU's*2 for thread_concurrency
set-variable         = thread_concurrency=8
set-variable         = myisam_sort_buffer_size=64M
#set-variable         = connect_timeout=5
#set-variable         = wait_timeout=5
server-id         = 1
[isamchk]
set-variable         = key_buffer=128M
set-variable         = sort_buffer=128M
set-variable         = read_buffer=2M
set-variable         = write_buffer=2M

[myisamchk]
set-variable         = key_buffer=128M
set-variable         = sort_buffer=128M
set-variable         = read_buffer=2M
set-variable         = write_buffer=2M
[WinMySQLadmin]
Server=D:/mysql/bin/mysqld-nt.exe

     这个方案,整体够用了,但是在pconnect和最大连接数上,需要研究max_connections没必要那么大,我个人认为几百就够,否则给服务器加大了不少负担,经常会当机连接超时的设置也要根据实际情况调整,大家可以自由调整,然后观察效果如何。

第二种
QUOTE:
7、MYSQL 的优化(/etc/my.cnf)
         1)确认在“[mysqld]”部分加入了“skip-innodb”和“skip-bdb”参数;
         2)确认在“[mysqld]”部分加入了“skip-name-resolve”和“skip-locking”参数;
         3)如果不需要的话,可以将二进制日志(binlog)停掉,方法是将“log-bin”注释掉;
         4)在内存允许的情况下,对一些参数进行重新配置,目标在于将大部分操作集中于内存中,尽量不进行磁盘操作,对于我的 MYSQL 服务器我是如下修改的,基于 2G 内存情况:

         [mysqld]
         set-variable     = key_buffer=512M
         set-variable     = max_allowed_packet=4M
         set-variable     = table_cache=1024
         set-variable     = thread_cache=64
         set-variable     = join_buffer_size=32M
         set-variable     = sort_buffer=32M
         set-variable     = record_buffer=32M
         set-variable     = max_connections=512
         set-variable     = wait_timeout=120
         set-variable     = interactive_timeout=120
         set-variable     = max_connect_errors=30000
         set-variable     = long_query_time=1
         set-variable     = max_heap_table_size=256M
         set-variable     = tmp_table_size=128M
         set-variable     = thread_concurrency=8
         set-variable     = myisam_sort_buffer_size=128M

         你可以根据“show status”命令返回的状态进行微调。我主要注意以下变量的数值,越小越好,最好为零:)
         Created_tmp_disk_tables
         Created_tmp_tables
         Created_tmp_files
         Slow_queries
另外 mysql wait_timeout 那个值设置大了没用 做10左右就可了 (大C说得)

wait_timeout是使用长久连线时 空闲进程的控制 只要数据库在连接状态 他是不进行干预的 不管是否有查询或更新操作 把这个设置小一点 再使用pconnect就比较理想了 ;) 

timeout的時間﹐我的經驗值是5-20﹐看你的SERVER的訪問量了~~ (梦飞说的)

访问量越大 这个值就应该越小 否则留出的空闲进程太多 会占用不必要的内存
在一个15分钟在线3000人的论坛上 设置为3比较合适 同时打开pconnect

第三种
数据库连接过多的错误,可能的原因分析及解决办法

QUOTE:
分析 

系统不能连接数据库,关键要看两个数据: 
1、数据库系统允许的最大可连接数max_connections。这个参数是可以设置的。如果不设置,默认是100。最大是16384。 
2、数据库当前的连接线程数threads_connected。这是动态变化的。 
查看max_connections、max_connections的办法见后。 

      如果 threads_connected == max_connections 时,数据库系统就不能提供更多的连接数了,这时,如果程序还想新建连接线程,数据库系统就会拒绝,如果程序没做太多的错误处理,就会出现类似强坛的报错信息。 

       因为创建和销毁数据库的连接,都会消耗系统的资源。而且为了避免在同一时间同时打开过多的连接线程,现在编程一般都使用所谓数据库连接池技术。 

但数据库连接池技术,并不能避免程序错误导致连接资源消耗殆尽。 

       这种情况通常发生在程序未能及时释放数据库连接资源或其他原因造成数据库连接资源不能释放,但强坛系统估计不会发生这种低级的编程错误。 
       该错误的简便的检查办法是,在刷新强坛页面时,不断监视threads_connected的变化。如果max_connections足够大,而threads_connected值不断增加以至达到max_connections,那么,就应该检查程序了。当然,如果采用数据库连接池技术,threads_connected增长到数据库连接池的最大连接线程数时,就不再增长了。 

从强坛出错的情况看,更大的可能性是数据库系统没能进行适当地配置。下面提出一点建议。供参考 

让你们的工程师把MySQL的最大允许连接数从默认的100调成32000。这就不会老出现连接过多的问题了。 


查看max_connections 

进入MySQL,用命令:show variables 
查看数据库最大可连接数的变量值:max_connections 



查看threads_connected 

进入MySQL,用命令:show status 
查看当前活动的连接线程变量值:threads_connected 


设置max_connections 

设置办法是在my.cnf文件中,添加下面的最后红色的一行: 

-------------------------------------------------------------------------------- 

[mysqld] 
port=3306 
#socket=MySQL 
skip-locking 
set-variable = key_buffer=16K 
set-variable = max_allowed_packet=1M 
set-variable = thread_stack=64K 
set-variable = table_cache=4 
set-variable = sort_buffer=64K 
set-variable = net_buffer_length=2K 
set-variable = max_connections=32000 


-------------------------------------------------------------------------------- 

修改完毕后,重启MySQL即可。当然,为了确保设置正确,应该查看一下max_connections。 

注意: 
1、虽然这里写的32000。但实际MySQL服务器允许的最大连接数16384; 
2、除max_connections外,上述其他配置应该根据你们系统自身需要进行配置,不必拘泥; 
3、添加了最大允许连接数,对系统消耗增加不大。 
4、如果你的mysql用的是my.ini作配置文件,设置类似,但设置的格式要稍作变通。
可见,mysql的优化,是多样化,且根据环境不同,必须灵活调整的,大家不可生搬硬套,自己慢慢体会吧