首先看看服务器是否允许查询缓存:
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值以影响他们自己对查询缓存的使用。下面的表显示了可能的值:
选项 |
描述 |
0或OFF |
不要缓存或查询结果。请注意这样不会取消分配的查询缓存区。要想取消,你应将query_cache_size设置为0。 |
1或ON |
缓存除了以SELECT SQL_NO_CACHE开头的所有查询结果。 |
2或DEMAND |
只缓存以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)可以看出,重复的查询越多,命中率就越高。
阅读(964) | 评论(0) | 转发(0) |