MySQL数据库缓存

转载 2016年08月30日 20:51:08

作者: scofield 
原文:Mysql 数据库缓存cache功能总结[转]
版权所有,转载时必须以链接形式注明作者和原出处并保留本声明。

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全部都会无效,并删除之。这里“数据表更改”包括: INSERTUPDATEDELETETRUNCATEALTER TABLEDROP 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

参考:

  1. http://dev.mysql.com/doc/refman/5.0/en/query-cache.html
  2. http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html
  3. http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/
作者: scofield 
原文:Query Cache
版权所有,转载时必须以链接形式注明作者和原出处并保留本声明。

初学Redis(3)——用Redis作为Mysql数据库的缓存

把Mysql结果集缓存到Redis的字符串或哈希结构中以后,我们面临一个新的问题,即如何为这些字符串或哈希命名,也就是如何确定它们的键。因为这些数据结构所对应的行都属于某个结果集,假如可以找到一种唯一...
  • qtyl1988
  • qtyl1988
  • 2014年09月24日 19:06
  • 46302

用Redis作为Mysql数据库的缓存(二)

把Mysql结果集缓存到Redis的字符串或哈希结构中以后,我们面临一个新的问题,即如何为这些字符串或哈希命名,也就是如何确定它们的键。因为这些数据结构所对应的行都属于某个结果集,假如可以找到一种唯一...
  • LanSeTianKong12
  • LanSeTianKong12
  • 2015年07月16日 09:42
  • 887

使用Memcache缓存mysql数据库操作的原理和缓存过程浅析

对于大型网站如facebook,ebay等网站,如果没有Memcache做为中间缓存层,数据访问不可能吃得消,对于一般网站,只要具备独立的服务器,完全可以通过配置Memcache提高网站访问速度和减少...
  • liqfyiyi
  • liqfyiyi
  • 2016年03月15日 09:40
  • 5100

MySQL数据库查询步骤和缓存原理

我们知道,数据库的查询功能是我们经常用到的,那么MySQL数据库是怎样进行查询的呢?本文我们就来介绍一下MySQL数据库的查询步骤以及缓存原理,接下来就让我们来一起了解一下这一部分内容。 当MySQ...
  • zk_haha09
  • zk_haha09
  • 2015年09月13日 17:24
  • 760

mysql数据库性能优化(包括SQL,表结构,索引,缓存)

优化目标 减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考...
  • Smile___you
  • Smile___you
  • 2016年06月13日 16:02
  • 1326

实时刷新缓存-处理mysql主从延迟的一些设计方案

在项目开发当中,经常有这样一种场景,对数据库进行添加、修改、删除操作的应用直接连接master库,只对数据库进行查询的应用,会先建立一个中央缓存,例如redis或者memcache,如果缓存没有命中,...
  • linsongbin1
  • linsongbin1
  • 2016年05月23日 09:38
  • 1722

MySQL查询缓存总结

可以通过下面的SQL查看当前查询缓存相关参数状态: SHOW VARIABLES LIKE '%query_cache%'; 输出结果类似下面:    qu...
  • PHPService
  • PHPService
  • 2015年07月05日 19:45
  • 3640

启用MySQL查询缓存

启用MySQL查询缓存可以极大地减低数据库服务器的CPU使用率,实际使用情况是:开启前CPU使用率120%左右,开启后降到了10%。 查看查询缓存情况: mysql> show v...
  • ClementAD
  • ClementAD
  • 2015年07月08日 17:42
  • 6434

MySQL缓存的查询和清除命令使用详解

清空mysql 查询缓存的可行方法 mysql对同一条sql进行了缓存,在第二次运行时, 瞬间就完成了,若要清除缓存,可通过下面的方法来实现 对一条sql进行优...
  • haiross
  • haiross
  • 2016年05月03日 09:42
  • 3154

初学Redis(3)——用Redis作为Mysql数据库的缓存

把MySQL结果集缓存到Redis的字符串或哈希结构中以后,我们面临一个新的问题,即如何为这些字符串或哈希命名,也就是如何确定它们的键。因为这些数据结构所对应的行都属于某个结果集,假如可以找到一种唯一...
  • xyw591238
  • xyw591238
  • 2016年06月22日 11:55
  • 1854
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MySQL数据库缓存
举报原因:
原因补充:

(最多只允许输入30个字)