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