同时在线访问量继续增大,对于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可以明确表示不使用查询缓冲。
