博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql 数据库缓存cache功能
阅读量:5787 次
发布时间:2019-06-18

本文共 2822 字,大约阅读时间需要 9 分钟。

hot3.png

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

参考:

转载于:https://my.oschina.net/slagga/blog/1923201

你可能感兴趣的文章
vim
查看>>
linux sort命令详解
查看>>
windows7中如何查看一个端口正在被占用
查看>>
python常用模块
查看>>
主流Java开源商业智能BI框架及其比较
查看>>
MVVM计算器(下)
查看>>
C++中指针和引用的区别
查看>>
簡單分稀 iptables 記錄 udp 微軟 138 端口
查看>>
Java重写equals方法和hashCode方法
查看>>
Spark API编程动手实战-07-join操作深入实战
查看>>
H3C-路由策略
查看>>
centos 修改字符界面分辨率
查看>>
LNMP之Mysql主从复制(四)
查看>>
阅读Spring源代码(1)
查看>>
nagios一键安装脚本,nagios监控被监控主机上的应用服务mysql数据库
查看>>
grep 命令
查看>>
JS二维数组的声明和使用
查看>>
v$archive_gap dg dataguard 断档处理 scn恢复
查看>>
问责IT风险管理:CIO需关注两个重点
查看>>
Winform打包发布图解
查看>>