mysql cache 功能分析:
1 mysql 的 cache 功能的 key 的生成原理是:把 select 语句按照一定的 hash 规则生成唯一的 key,select 的结果生成 value,即 key=>value。所以对于 cache 而言,select 语句是区分大小写的,也区分空格的。两个 select 语句必须完完全 全一致,才能够获取到同一个 cache。
2 生成 cache 之后,只要该 select 中涉及到的 table 有任何的数据变动 (insert,update,delete 操作等), 相 关的所有 cache 都会被删除。因此只有数据很少变动的 table,引入 mysql 的 cache 才较有意义。关于这方面的测试,可以参考:《Query Cache,看上去很美》一文。
所以,mysql 的 cache 功能只适用于下列场合:数据变动较少,select 较多的 table。
那么。在复杂的系统中,如何使用 mysql 的 cache 功能呢,基本方法如下:
配置 query_cache_type,同时改写程序。
query_cache_type 0 代表不使用缓冲, 1 代表使用缓冲,2 代表根据需要使用。
设置 1 代表缓冲永远有效,如果不需要缓冲,就需要使用如下语句:
SELECT SQL_NO_CACHE * FROM my_table WHERE …
如果设置为 2 ,需要开启缓冲,可以用如下语句:
SELECT SQL_CACHE * FROM my_table WHERE …
So,最简单又可靠的做法是:把 query_cache_type 设置为 2,然后在需要提高 select 速度的地方,使用:
SELECT SQL_CACHE * FROM…
的方式进行 SELECT。
【mysql cache 调试笔记】
1 可以使用下列命令开启 mysql 的 select cache 功能:
SET GLOBAL query_cache_size = 102400000;
因为当 query_cache_size 默认为 0 时,是不开启 cache 功能的。
2 调试:
查看 cache 的设置:
show variables like ‘%query_cache%’;
性能监控:
show status like ‘%Qcache%’;
3 mysql cache 的清理:
可以使用 FLUSH QUERY CACHE 语句来清理查询缓存碎片以提高内存使用性能。该语句不从缓存中移出任何查询。
RESET QUERY CACHE 语句从查询缓存中移出所有查询。FLUSH TABLES 语句也执行同样的工作。
Query Cache
当你的数据库打开了 Query Cache(简称 QC)功能后,数据库在执行 SELECT 语句时,会将其结果放到 QC 中,当下一次处理同样的 SELECT 请求时,数据库就会从 QC 取得结 果,而不需要去数据表中查询。
在这个 “Cache 为王” 的时代,我们总是通过不同的方式去缓存我们的结果从而提高响应效率,但一个缓存机制是否有效,效果如何,却是一个需要好好 思考的问题。在 MySQL 中的 Query Cache 就是一个适用较少情况的缓存机制。在上图中,如果缓存命中率非常高的话,有测试表明在极端情况下可以提高效率 238%[1]。 但实际情况如何?Query Cache 有如下规则,如果数据表被更改,那么和这个数据表相关的全部 Cache 全部都会无效,并删除之。这里 “数据表更改” 包括: INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, orDROP DATABASE 等。举 个例子,如果数据表 posts 访问频繁,那么意味着它的很多数据会被 QC 缓存起来,但是每一次 posts 数据表的更新,无论更新是不是影响到了 cache 的数据,都会将全部和 posts 表相关的 cache 清除。如果你的数据表更新频繁的话,那么 Query Cache 将会成为系统的负担。有实验表明,糟糕时,QC 会降低系统 13%[1] 的处理能力。
如果你的应用对数据库的更新很少,那么 QC 将会作用显著。比较典型的如博客系统,一般博客更新相对较慢,数据表相对稳定不变,这时候 QC 的作用会比 较明显。
再如,一个更新频繁的 BBS 系统。下面是一个实际运行的论坛数据库的状态参数:
QCache_hit 5280438 QCache_insert 8008948 Qcache_not_cache 95372 Com select 8104159 可以看到,数据库一共往 QC 中写入了约 800W 次缓存,但是实际命中的只有约 500W 次。也就是说,每一个缓存的使用率约为 0.66 次。很难说,该 缓存的作用是否大于 QC 系统所带来的开销。但是有一点是很肯定的,QC 缓存的作用是很微小的,如果应用层能够实现缓存,将可以忽略 QC 的效果。
————- 下面是关于 QC 的一些其他细节 —————–
一、Query Cache 相关参数:
query_cache_size QC 占用空间大小,通过将其设置为 0 关闭 QC 功能 query_cache_type 0 表示关闭 QC;1 表示正常缓存;2 表示 SQL_CACHE 才缓存 query_cache_limit 最大缓存结果集 query_cache_min_res_unit 手册上说,QC 会按照这个值分配缓存 block 的大小。 Qcache_lowmem_prunes 这是一个状态变量 (show status),当缓存空间不够需要释放旧的缓存时,该值会自增。
二、Query Cache 观察:
CREATE TABLE t1 (id INT,var1 varchar (10)); //Com_select:8 Qcache_hits:1 INSERT INTO t1 VALUES (1,’WWW’); //Com_select:8 Qcache_hits:1 SELECT * FROM t1 WHERE id=1; //Com_select:9 Qcache_hits:1 SELECT * FROM t1 WHERE id=1; //Com_select:9 Qcache_hits:2 Qcache_queries_in_cache:1 INSERT INTO t1 VALUES (2,’RRRR’); //Com_select:9 Qcache_hits:2 Qcache_queries_in_cache:0 SELECT * FROM t1 WHERE id=1; //INSERT 后 Cache 失效 //Com_select:10 Qcache_hits:2 Qcache_queries_in_cache:1
参考:
http://dev.mysql.com/doc/refman/5.0/en/query-cache.htmlhttp://dev.mysql.com/doc/refman/5.0/en/server-system-variables.htmlhttp://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/