当你的数据库打开了Query Cache(简称QC)功能后,数据库在执行SELECT语句时,会将其结果放到QC中,当下一次处理同样的SELECT请求时,数据库就会从QC取得结 果,而不需要去数据表中查询。
在这个“Cache为王”的时代,我们总是通过不同的方式去缓存我们的结果从而提高响应效率,但一个缓存机制是否有效,效果如何,却是一个需要好好 思考的问题。在MySQL中的Query Cache就是一个适用较少情况的缓存机制。在上图中,如果缓存命中率非常高的话,有测试表明在极端情况下可以提高效率238%[1]。 但实际情况如何?Query Cache有如下规则,如果数据表被更改,那么和这个数据表相关的全部Cache全部都会无效,并删除之。这里“数据表更改”包括: INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE,DROP TABLE, or DROP 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
参考:
相关推荐
源码 博文链接:https://raymondhekk.iteye.com/blog/250427
MSQL问题集合,线上环境到底要不要开启query cache
原理 QueryCache(下面简称QC)是根据SQL语句来cache的。一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用QC。每个Cache都是以SQL文本作为key来存的。在应用QC之前,SQL文本不会被作任何处理。也就是说,...
Querycache (TM) 是一种智能分布式缓存,用于存储来自异构存储系统的 SQL 结果。 用户组: : user 路线图: ://docs.google....
Laravel开发-laravel-query-cache Laravel查询缓存
会发现其变量have_query_cache的值是yes,MYSQL初学者很容易以为这个参数为YES就代表开启了查询缓存,实际上是不对的,该参数表示当前版本的MYSQL是否支持Query Cache,实际上是否开启查询缓存是看另外一个参数的值:...
如果空格是加在query之前,比如是在query的起始处加了空格,这样是丝毫不影响query cache的结果的,mysql认为这是一条query, 而如果空格是在query中,那会影响query cache的结果,mysql会认为是不同的query
MySQL之前有一个查询缓存Query Cache,从8.0开始,不再使用这个查询缓存,那么放弃它的原因是什么呢?在这一篇里将为您介绍。 MySQL查询缓存是查询结果缓存。它将以SEL开头的查询与哈希表进行比较,如果匹配,则返回...
mycat连接数据库8.0以上用1.6.4有bug,经常无法插入;使用1.6.5以上版本 程序连接报错query_cache_size。 本资源基于1.6.7基础之上进行优化
基于源码修改JDBC8驱动连接Mycat1.6报错 Unknown system variable 'query_cache_size' ,配置好mycat相应配置直接bin目录启动即可
还有一个类型的 CACHE 就是 QueryCache . 它的作用就是缓存一个 Query 以及 Query 返回对象的 Identifier 以及对象的类型 . 有了 QueryCache 后就可以高效的使用 SECOND LEVEL CACHE. hibernate 查询缓存 ...
use Kyrenator \ QueryCache \ QueryCache ;use Illuminate \ Database \ Eloquent \ Model ;class Post extends Model { use QueryCache ;} ###第3步:在雄辩地说出使用“记住”方法时调用“记住”方法时,您可以...
'apostrophe-query-cache' : { } 内存管理 由于没有主动管理缓存使用了多少内存,它每 60 秒自动失效一次。 在大多数情况下,这足以保持合理的内存使用。 这也是一个非常粗糙的解决方案; 某种最近最少使用的策略会...
Laravel雄辩的查询缓存 Laravel Eloquent Query Cache带来了很久以前从Laravel中删除的Remember remember()功能。 它直接在Eloquent级别上添加了缓存功能,从而在数据库查询中使用了缓存。 :handshake: 配套GitHub上...
ActiveRecord::QueryCache ActionDispatch::Cookies ActionDispatch::Session::CookieStore ActionDispatch::Flash ActionDispatch::ParamsParser ActionDispatch::Head Rack::ConditionalGet Rack::ETag ...
3.4.4. Second-level and query cache ................................................................ 43 3.4.5. Query Language Substitution ................................................................
一般MySQL使用Query Cache。NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说性能就要高很多。 灵活的数据模型:NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在...