使用MYSQL查询缓存

使用 Mysql 的查询缓存MySQL 的查询缓存是将客户端执行的 SELECT 语句和查询结构都缓存起来,如果再执行一个相同的查询,则不再进行解析和查询,直接将缓存的结果返回。这样的特性对于更新不频繁,以读操作为主的数据库有很大的性能提升。对于更新频繁的数据库则相对没有那么有效,因为数据的更新会将查询从查询缓存条目清空。
首先我们需要确认当前的数据库环境是否可以使用查询缓存特性,检查参数 have_query_cache :
mysql> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
1 row in set (0.00 sec)
然后我们再查看当前的查询缓存的参数设置情况:
mysql> show variables like 'query_cache%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
5 rows in set (0.00 sec)
query_cache_size 为查询缓存的大小,默认值为 0 ,表示禁用查询缓存。如果需要启用查询缓存,则需要修改这个参数的值。需要注意的是,由于查询缓存本身需要 40K 左右来保存数据结构,所以如果设置这个参数,则这个参数的值不能小于 40K 。
query_cache_type 设置查询缓存的工作方式: 0 或者 OFF ,表示阻塞查询缓存; 1 或 ON 表示允许缓存,以 SELECT SQL_NO_CACHE 开始的查询语句除外。 2 或 DEMAND ,表示仅对以 SELECT SQL_CACHE 开始的那些查询语句启用缓存。可以根据需要设置该参数的值。
query_cache_limit 设置可以被缓存的具体查询结果的最大值,默认值是 1M ,结果超过该值则不缓存。
可以使用 FLUSH QUERY CACHE 或者 RESET QUERY CACHE 来维护查询缓存:
2 FLUSH QUERY CACHE 用来清理查询缓存碎片,以提高内存使用性能。该语句不会从缓存中移出任何查询。
2 RESET QUERY CACHE 语句从查询缓存中移出所有查询。 FLUSH TABLES 语句也执行同样的工作。
可以使用 SHOW STATUS 来监控查询缓存使用的情况:
mysql> show status like 'Qcache%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 90752 |
| Qcache_hits | 4 |
| Qcache_inserts | 2 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 1 |
| Qcache_queries_in_cache | 2 |
| Qcache_total_blocks | 7 |
+-------------------------+-------+
8 rows in set (0.00 sec)
Qcache_hits :表示从查询缓存中返回结果的次数。
Qcache_inserts :表示加入到查询缓存的次数。
如果加入查询缓存的次数很大,但是从查询缓存返回结果的次数很小,说明查询缓存的效果并不是很好,可能是 SQL 复用的不多,也可能是结果更新的很频繁不适于缓存。
Qcache_lowmem_prunes :表示由于内存不够而从缓存删除的查询数量。如果这个值比较大,说明查询缓存设置的可能偏小,也有可能是因此导致 Qcache_hits 不够理想。
Qcache_queries_in_cache :表示当前被缓存的查询的数量,一旦数据发生了变化,则查询会自动从缓存中清除,这个值也会减小。如果 Qcache_inserts 很大,但是 Qcache_lowmem_prunes 和 Qcache_queries_in_cache 都偏小,则可能是由于表变更频繁导致不能使用查询缓存。
Qcache_not_cached :表示没有被缓存的查询的数目,查询没有被缓存的原因可能是因为结果集超过参数的设置,或者查询的时候指定 SQL_NO_CACHE ,或者是按照 query_cache_type 设定的原则,不会被缓存。

添加新评论 »