MySQL查询缓存

用于保存MySQL查询语句返回的完整结果,被命中时,MySQL会立即返回结果,省去解析、优化和执行等阶段。

如何检查缓存?

MySQL保存结果于缓存中:

把SELECT语句本身做hash计算,计算结果为key,查询结果作为value。

不会被缓存的数据:

查询语句中有一些不确定数据时,不会缓存,例如NOW(),CURRENT_TIME(),一般来说,如果查询中包含自定义函数、存储函数、用户变量、临时表、mysql库中系统表、或者任何包含权限的表,一般都不会被缓存。

缓存会带来额外开销:

1、每个查询都得先检查是否命中;

2、检查结果要先缓存;

与缓存相关的变量:

查看缓存变量SHOW GLOBAL VARIABLES LIKE 'query_cache%';

query_cache_limit:单个缓存对象的最大值,超出的不缓存,手动使用SQL_NO_CACHE可以人为避免尝试缓存返回结果超出此参数限定值的语句。

query_cache_min_res_unit:存储缓存的最小内存块;计算方法:(query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache

query_cache_size:总空间,单位为字节,大小必须是1024倍数。MySQL启动时,会一次分配并立即初始化这里指定大小的内存空间,这意味着,如果修改此大小,会清空缓存,并重新初始化;

query_cache_type:查询缓存类型;是否开启缓存功能,开启方式有三种{ON|OFF|DEMAND};

DEMAND:意味着SELECT语句明确使用SQL_CACHE选项是才会缓存;query_cache_wlock_invalidate:如果某个数据表被其他用户连接锁住了,是否仍然从缓存中返回结果,OFF表示返回。

如何判断命中率:

SHOW GLOBAL STATUS LIKE 'Qcache%';

Qcache_free_blocks:空闲块数

Qcache_free_memory:空闲空间

Qcache_hits:命中次数

Qcache_inserts:向缓存空间中写入缓存的次数

Qcache_lowmem_prunes:因为内存小,腾出内存的次数

Qcache_not_cached:没被缓存的个数

Qcache_queries_in_cache:在缓存中缓存的插入的查询的个数

Qcache_total_blocks:总块数

碎片整理:FLUSH QUERY_CACHE

清除缓存:RESET QUERY_CACHE

计算命中率:

SHOW GLOBAL STATUS WHERE Variable_name='Qcache_hits' OR Variable_name='Com_select';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Com_select    | 10     |

| Qcache_hits   | 0      |

+---------------+-------+

Qcache_hits/( Com_select+ Qcache_hits)

还需要参考命中和写入的比率,即Qcache_hits/ Qcache_inserts的值,此值如果能大于3:1,则表明缓存也是有效的,能达到10:1,为比较理想的情况。如果命中率很低,比值也徘徊在1:1,那说明缓存没什么卵用,还是关了吧。

缓存优化思路:

使用缓存时如何能够让缓存命中,提高缓存的有效性:

1、批量写入而非多次单个写入,这样即可仅一次的影响缓存

2、过大的缓存空间,可能会使大量的缓存失效时导致造成服务器假死,所以缓存空间不宜过大

3、必要时,使用SQL_NO_CACHE手动控制缓存

4、对写密集型的应用场景来说,禁用缓存反而能提高性能

MySQL查询缓存的更多相关文章

  1. mysql查询缓存参数

    由人说mysql查询缓存是鸡肋,也许吧,但还是要看场景: 查询缓存: 开启查询缓存:/etc/my.cnfquery_cache_type=1 重启

  2. 启用MySQL查询缓存

    启用MySQL查询缓存能够极大地减低数据库server的CPU使用率,实际使用情况是:开启前CPU使用率120%左右,开启后降到了10%. 查看查询缓存情况: mysql> show varia ...

  3. mysql查询缓存打开、设置、参数查询、性能变量意思

    http://blog.sina.com.cn/s/blog_75ad10100101by7j.html http://www.cnblogs.com/zemliu/archive/2013/08/0 ...

  4. mysql 查询缓存配置和查看

    Mysql 查询缓存 查询缓存的作用就是当查询接收到一个和之前同样的查询,服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询.这样就大大提高了性能,节省时间. 1.配置查询缓存 修改配置文 ...

  5. Mysql 查询缓存总结

    Mysql 查询缓存总结 MySQL查询缓存解释 缓存完整的SELECT查询结果,也就是查询缓存.保存查询返回的完整结果.当查询命中该缓存,mysql会立刻返回结果,跳过了解析.优化和执行阶段, 查询 ...

  6. Mysql查询缓存碎片、缓存命中率及Nagios监控

    Mysql 的优化方案,在互联网上可以查找到非常多资料,今天对Mysql缓存碎片和命中率作了详细了解,个人作了简单整理. 一.Mysql查询缓存碎片和缓存命中率. mysql> SHOW STA ...

  7. RDS for MySQL查询缓存 (Query Cache) 的设置和使用

    https://help.aliyun.com/knowledge_detail/41717.html?spm=5176.7841698.2.11.aCvOXJ RDS for MySQL查询缓存 ( ...

  8. Mysql查询缓存研究

    转载声明:本文为DBA+社群原创文章,转载必须连同本订阅号二维码全文转载,并注明作者名字及来源:DBA+社群(dbaplus). http://mp.weixin.qq.com/s?__biz=MzI ...

  9. 【转】MySQL查询缓存详解

    [转]MySQL查询缓存详解 转自:https://www.cnblogs.com/Alight/p/3981999.html 相关文章:http://www.zsythink.net/archive ...

随机推荐

  1. No matching provisioning profile found: Your build settings specify a provis...

    解决办法: (1)右键.xcodeproj文件,显示包内容--->找到project.pbxproj文件打开--->查找“PROVISIONING_PROFILE"---> ...

  2. JAVA中SERIALVERSIONUID的解释

    serialVersionUID作用:        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式:       一个是默认的1L,比如:private st ...

  3. druid.properties的配置

    driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://NoOne:3306/eyes<!--需修改--> username=root ...

  4. K近邻分类法

    K近邻法 K近邻法:假定存在已标记的训练数据集,分类时对新的实例根据其K个最近邻的训练实例的类别,通过多数表决等分类决策规则进行预测. k近邻不具有显示学习的过程,是“懒惰学习”(lazy learn ...

  5. js之事件冒泡和事件捕获详细介绍

    (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...

  6. Request.ServerVariables 获取服务器或者客户端信息

    本机ip[客户端]:request.servervariables("remote_addr") 从哪个页面转到当前页面的:Request.ServerVariables(&quo ...

  7. CSS3 Background-size

    详情见链接 http://www.w3cplus.com/content/css3-background-size/ 例子:http://www.topcss.org/demo/background- ...

  8. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  9. 第6章 第一个Linux驱动程序:统计单词个数

    编写一个Linux的一般步骤: 第1步:建立Linux驱动骨架(装载和卸载Linux驱动) 第2步:注册和注销设备文件 第3步:指定和驱动相关的信息 第4步:指定回调函数 第5步:编写业务逻辑 第6步 ...

  10. npm(cnpm)介绍

    1.npm(node package manager) nodejs的包管理器,用于node插件管理(安装.卸载.更新.管理依赖等); 2.使用npm安装安装插件: 1).命令提示符执行 npm in ...