奇宝库 > MySQL数据库优化经验详谈

MySQL数据库优化经验详谈

与此同时,在线访问量持续增加。对于1 GB内存的服务器来说,显然很吃力。甚至每天服务器都会时不时的崩溃或者卡顿。这个问题困扰了我半个多月。mysql是一个非常可扩展的算法,所以你通常可以用很少的内存运行,或者给MySQL更多的内存以获得更好的性能。

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

一般my-medium.cnf的准备文件就能满足我们的大部分需求;一般情况下,我们会将配置文件复制到/etc/my.cnf中,只需要修改这个配置文件。您可以使用MySQL管理变量extended-statusu rootp查看当前参数。有三个配置参数是最重要的,即:

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天。

比例接近1:8000,身体很好。

另一种估算key_buffer_size的方法是将网站数据库中每个表的索引所占用的空间相加。以这个服务器为例:较大的表的索引加起来大约有125M,这个数字会随着表的变大而变大。

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

通过调整以下参数可以知道query_cache_size设置是否合理

q _ lowmeme _ prunes的值很大,说明缓冲区经常不足。同时q _ cache _ hits的值非常大,说明查询缓冲区使用频繁。这时候q _ cache _ hits的值就需要增加,说明你的查询重复率很低。这种情况下使用查询缓冲会影响效率,可以考虑不使用查询缓冲。此外,在SELECT语句中添加SQL_NO_CACHE可以清楚地表明没有使用查询缓冲。

Qcache_free_blocks,如果这个值很大,说明缓冲区有很多碎片。query_cache_type指定是否使用查询缓冲。

我设定:

获取以下状态值:

如果内存允许32M,应该会增加。

Table_cache指定表缓存的大小。每当MySQL访问表时,如果表缓冲区中还有空间,就打开表并放入其中,这样可以更快地访问表内容。可以通过检查Open_tables和Opened_tables在高峰时间的状态值来决定是否需要增加table_cache的值。如果发现open_tables等于table_cache,并且open _ tables在增长,那么就需要增加table_cache的值(上面的状态值可以使用SHOW STATUS LIKE 'Open%tables ' ')来获得。注意,不能盲目地将table_cache设置为较大的值。如果设置过高,可能会导致文件描述符不足,从而导致性能不稳定或连接失败。

对于1G内存的机器,推荐值为128-256。

设置table_cache=256。

获得以下状态:

虽然open_tables已经和table_cache持平,但是相对于服务器的运行时间,已经运行了20天,open _ tables的值也很低。所以增加table_cache的值应该用处不大。如果运行6小时后出现上述值,就应该考虑增加table_cache。

如果您不需要记录二进制日志,请关闭此功能。注意,关闭后,问题前的数据无法恢复,需要手动备份。二进制日志包含所有更新数据的语句,其目的是在还原数据库时,用它将数据尽可能还原到最后的状态。此外,如果进行同步复制,还需要使用二进制日志来传输更改。

Log_bin指定日志文件。如果没有提供文件名,MySQL将生成自己的默认文件名。MySQL会自动在文件名后面加一个数字引号,每次启动服务都会重新生成一个新的二进制文件。

另外,log-bin-index可以用来指定索引文件;使用binlog-do-db指定记录的数据库;使用binlog-ignore-db指定一个不记录日志的数据库。注意,binlog-do-db和binlog-ignore-db一次只指定一个数据库,指定多个数据库需要多个语句。而且MySQL会把所有的数据库名都改成小写,指定数据库的时候必须用所有的小写名,否则不行。

要关闭这个功能,只要在他前面加个#就可以了。

#垃圾箱

打开慢速查询日志对于跟踪有问题的查询非常有用。它记录所有检查了long_query_time的查询,如果需要,还记录不使用索引的记录。下面是一个慢速查询日志的示例:

要启动慢速查询日志,您需要设置参数log_slow_queries、long_query_times、log-queries-not-using-indexes。

Log _ slow _ queries指定日志文件。如果不提供文件名,MySQL会生成自己的默认文件名。

Long_query_times指定慢速查询的。

本文来自网络,不代表本站立场,转载请注明出处: