Chinaunix首页 | 论坛 | 博客
  • 博客访问: 477037
  • 博文数量: 99
  • 博客积分: 3621
  • 博客等级: 中校
  • 技术积分: 1089
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-22 16:29
文章存档

2012年(21)

2011年(28)

2010年(50)

分类: Mysql/postgreSQL

2010-12-16 16:50:10

首先看看服务器是否允许查询缓存:
 

mysql> show variables like '%query%';
+------------------------------+-----------------------------------+
| Variable_name | Value |
+------------------------------+-----------------------------------+
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| long_query_time | 10.000000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 16777216 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+------------------------------+-----------------------------------+
12 rows in set (0.00 sec)


红色部分,证明已经打开查询缓存。顺便再解释一下各个变量的意思

ft_query_expansion_limit  使用WITH QUERY EXPANSION进行全文搜索的最大匹配数
have_query_cache        是否开启查询缓存
long_query_time         慢查询的时长,默认10秒
query_alloc_block_size  为查询分析和执行过程中创建的对象分配的内存块大小。如果内存分段过程中遇到问题,将该变量增加一位会有帮助。
query_cache_limit      不要缓存大于该值的结果。默认值是1MB
query_cache_min_res_unit  查询缓存分配的最小块的大小,默认4K

query_cache_size        为缓存查询结果分配的内存的数量
query_cache_type        设置查询缓存类型。设置GLOBAL值可以设置后面的所有客户端连接的类型。客户端可以设置SESSION值以影响他们自己对查询缓存的使用。下面的表显示了可能的值:

选项

描述

0OFF

不要缓存或查询结果。请注意这样不会取消分配的查询缓存区。要想取消,你应将query_cache_size设置为0

1ON

缓存除了以SELECT SQL_NO_CACHE开头的所有查询结果。

2DEMAND

只缓存以SELECT SQL_NO_CACHE开头的查询结果。


query_cache_wlock_invalidate  一般情况,当客户端对MyISAM表进行WRITE锁定时,如果查询结果位于查询缓存中,则其它客户端未被锁定,可以对该表进行查询。将该变量设置为1,则可以对表进行WRITE锁定,使查询缓存内所有对该表进行的查询变得非法。这样当锁定生效时,可以强制其它试图访问表的客户端来等待。
query_prealloc_size           用于查询分析和执行的固定缓冲区的大小。在查询之间该缓冲区不释放。如果你执行复杂查询,分配更大的query_prealloc_size值可以帮助提高性能,因为它可以降低查询过程中服务器分配内存的需求。

slow_query_log               是否打开慢查询日志
slow_query_log_file          慢查询日志的位置

上面这些变量的说明在参考文档都能够查到详细的解释.

在做实验之前我重启了MYSQL服务,让各个统计值复位。

来看看查询缓存的状态值:

mysql> show status like '%Qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16768408 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+----------+
8 rows in set (0.00 sec)

mysql> show status like '%Com_select%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select | 0 |
+---------------+-------+
1 row in set (0.00 sec)

mysql>


在配置文件里给查询缓存分配了16M的内存。其他状态值都是初始的0.内存块也是完整的1块,没有碎片。Com_select这个变量统计有效查询,如SHOW VARIABLES 这样的,不累计。

查询一条记录

mysql> use cpc;
Database changed
mysql> select * from area where area_id=100;
+---------+-----------+-------------+----------------+----------+-------+------------+
| area_id | name | area_number | parent_area_id | fullname | state | area_level |
+---------+-----------+-------------+----------------+----------+-------+------------+
| 100 | 鍖椾含甯? | 100 | 1 | | 1 | 2 |
+---------+-----------+-------------+----------------+----------+-------+------------+
1 row in set (0.01 sec)

mysql> show status like '%Qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16766872 |
| Qcache_hits | 0 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 1 |
| Qcache_queries_in_cache | 1 |
| Qcache_total_blocks | 4 |
+-------------------------+----------+
8 rows in set (0.00 sec)

mysql> show status like '%Com_select%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select | 2 |
+---------------+-------+
1 row in set (0.00 sec)

mysql>


可以看到,添加到缓存的查询+1了。红色部分。USE CPC不被缓存。

再重复查询2次刚才的ID=100的,这时候结果直接从缓存得到,缓存命中次数+2。com_select不增加。

mysql> show status like '%Qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16766872 |
| Qcache_hits | 2 |
| Qcache_inserts | 1 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 2 |
| Qcache_queries_in_cache | 1 |
| Qcache_total_blocks | 4 |
+-------------------------+----------+
8 rows in set (0.00 sec)


mysql> show global status like '%Com_select%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 3     |
+---------------+-------+
1 row in set (0.00 sec)

mysql>


现在来算一下缓存的命中率

2/(2+3)=0.4  有40%的命中率。从计算的公式命中率=Qcache_hits/(Qcache_hits+Com_select)可以看出,重复的查询越多,命中率就越高。

阅读(921) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~