LAMP系统性能调优之MySQL服务器调优
2010-08-23 15:58:28 来源:WEB开发网对查询进行缓存
很多 LAMP应用程序都严重依赖于数据库,但却会反复执行相同的查询。每次执行查询时,数据库都必须要执行相同的工作 ——对查询进行分析,确定如何执行查询,从磁盘中加载信息,然后将结果返回给客户机。MySQL 有一个特性称为查询缓存,它将(后面会用到的)查询结果保存在内存中。在很多情况下,这会极大地提高性能。不过,问题是查询缓存在默认情况下是禁用的。
将query_cache_size = 32M 添加到 /etc/my.conf 中可以启用32MB的查询缓存。
监视查询缓存
在启用查询缓存之后,重要的是要理解它是否得到了有效的使用。MySQL 有几个可以查看的变量,可以用来了解缓存中的情况。清单 2 给出了缓存的状态。
清单 2. 显示查询缓存的统计信息mysql> SHOW STATUS LIKE 'qcache%';
+-------------------------+------------+
| Variable_name | Value |
+-------------------------+------------+
| Qcache_free_blocks | 5216 |
| Qcache_free_memory | 14640664 |
| Qcache_hits | 2581646882 |
| Qcache_inserts | 360210964 |
| Qcache_lowmem_prunes | 281680433 |
| Qcache_not_cached | 79740667 |
| Qcache_queries_in_cache | 16927 |
| Qcache_total_blocks | 47042 |
+-------------------------+------------+
8 rows in set (0.00 sec)
这些项的解释如表 1 所示。
表 1. MySQL 查询缓存变量
变量名 | 说明 |
Qcache_free_blocks | 缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE 会对缓存中的碎片进行整理,从而得到一个空闲块。 |
Qcache_free_memory | 缓存中的空闲内存。 |
Qcache_hits | 每次查询在缓存中命中时就增大。 |
Qcache_inserts | 每次插入一个查询时就增大。命中次数除以插入次数就是不中比率;用1 减去这个值就是命中率。在上面这个例子中,大约有87%的查询都在缓存中命中。 |
Qcache_lowmem_prunes | 缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的free_blocks 和 free_memory可以告诉您属于哪种情况)。 |
Qcache_not_cached | 不适合进行缓存的查询的数量,通常是由于这些查询不是SELECT 语句。 |
Qcache_queries_in_cache | 当前缓存的查询(和响应)的数量。 |
Qcache_total_blocks | 缓存中块的数量。 |
通常,间隔几秒显示这些变量就可以看出区别,这可以帮助确定缓存是否正在有效地使用。运行FLUSH STATUS可以重置一些计数器,如果服务器已经运行了一段时间,这会非常有帮助。
使用非常大的查询缓存,期望可以缓存所有东西,这种想法非常诱人。由于 mysqld 必须要对缓存进行维护,例如当内存变得很低时执行剪除,因此服务器可能会在试图管理缓存时而陷入困境。作为一条规则,如果 FLUSH QUERY CACHE 占用了很长时间,那就说明缓存太大了。
更多精彩
赞助商链接