1011MySQL Query Cache学习笔记

转自:http://blog.chinaunix.net/uid-16844903-id-321156.html

测试环境

MySQL 5.5

innodb_version 1.1.6

MySQL Query Cache就是用来缓存和 Query 相关的数据的。具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。大概来讲,就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中。

mysql> show variables like ‘query_cache%‘\G

*************************** 1. row ***************************

Variable_name: query_cache_limit

Value: 2097152

允许Cache的单条Query结果集的最大容量,该值为2MB,超过此参数设置的 Query 结果集将不会被 Cache

*************************** 2. row ***************************

Variable_name: query_cache_min_res_unit

Value: 4096

设置Query Cache中每次分配内存的最小空间大小,也就是每个Query的Cache最小占用的内存空间大小

*************************** 3. row ***************************

Variable_name: query_cache_size

Value: 67108864

设置Query Cache所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数

*************************** 4. row ***************************

Variable_name: query_cache_type

Value: ON

控制Query Cache功能的开关,可以设置为0(OFF),1(ON)和2(DEMAND)三种,意义分别如下:

0(OFF):关闭Query Cache功能,任何情况下都不会使用 Query Cache

1(ON):开启Query Cache功能,但是当SELECT语句中使用的SQL_NO_CACHE提示后,将不使用Query Cache

2(DEMAND):开启Query Cache功能,但是只有当SELECT语句中使用了SQL_CACHE提示后,才使用 Query Cache

*************************** 5. row ***************************

Variable_name: query_cache_wlock_invalidate

Value: OFF

控制当有写锁定发生在表上的时刻是否先失效该表相关的Query Cache,如果设置为1(TRUE),则在写锁定的同时将失效该表相关的所有Query Cache,如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的Query Cache。

如何确认一个系统的 Query Cache的运行是否健康,命中率如何,设置量是否足够?

mysql> show global status like ‘Qcache%‘\G

*************************** 1. row ***************************

Variable_name: Qcache_free_blocks

Value: 1

目前还处于空闲状态的 Query Cache中内存Block数目

*************************** 2. row ***************************

Variable_name: Qcache_free_memory

Value: 67091120

目前还处于空闲状态的Query Cache内存总量

*************************** 3. row ***************************

Variable_name: Qcache_hits

Value: 0

Query Cache 命中次数

*************************** 4. row ***************************

Variable_name: Qcache_inserts

Value: 0

向 Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数

*************************** 5. row ***************************

Variable_name: Qcache_lowmem_prunes

Value: 0

当 Query Cache 内存容量不够,需要从中删除老的 Query Cache 以给新的 Cache 对象使用的次数

*************************** 6. row ***************************

Variable_name: Qcache_not_cached

Value: 17

没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL

*************************** 7. row ***************************

Variable_name: Qcache_queries_in_cache

Value: 0

目前在 Query Cache 中的 SQL 数量

*************************** 8. row ***************************

Variable_name: Qcache_total_blocks

Value: 1

Query Cache 中总的 Block 数量

下面是从该文章,摘录的常见问题。

  1. Query Cache 如何处理子查询的?

这是我遇到的最为常见的一个问题。其实 Query Cache 是以客户端请求提交的 Query 为对象来处理的,只要客户端请求的是一个 Query,无论这个 Query 是一个简单的单表查询还是多表 Join,亦或者是带有子查询的复杂SQL,都被当作成一个 Query,不会被分拆成多个 Query 来进行 Cache。所以,存在子查询的复杂 Query 也只会产生一个Cache对象,子查询不会产生单独的Cache内容。UNION[ALL] 类型的语句也同样如此。

  1. Query Cache 是以 block 的方式存储的数据块吗?

不是,Query Cache 中缓存的内容仅仅只包含该 Query 所需要的结果数据,是结果集。当然,并不仅仅只是结果数据,还包含与该结果相关的其他信息,比如产生该 Cache 的客户端连接的字符集,数据的字符集,客户端连接的Default Database等。

  1. Query Cache 为什么效率会非常高,即使所有数据都可以 Cache 进内存的情况下,有些时候也不如使用 Query Cache 的效率高?

Query Cache的查找,是在MySQL接受到客户端请求后在对Query进行权限验证之后,SQL解析之前。也就是说,当 MySQL接受到客户端的SQL后,仅仅只需要对其进行相应的权限验证后就会通过Query Cache来查找结果,甚至都不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生任何存储引擎的交互,减少了大量的磁盘IO和CPU运算,所以效率非常高。

  1. 客户端提交的SQL语句大小写对 Query Cache有影响吗?

有,由于Query Cache在内存中是以HASH结构来进行映射,HASH 算法基础就是组成SQL语句的字符,所以必须要整个 SQL语句在字符级别完全一致,才能在Query Cache中命中,即使多一个空格也不行。

  1. 一个SQL语句在Query Cache中的内容,在什么情况下会失效?

为了保证Query Cache中的内容与是实际数据绝对一致,当表中的数据有任何变化,包括新增,修改,删除等,都会使所有引用到该表的SQL的Query Cache失效。

  1. 为什么我的系统在开启了Query Cache之后整体性能反而下降了?

当开启了Query Cache之后,尤其是当我们的 query_cache_type 参数设置为 1 以后,MySQL 会对每个 SELECT 语句都进行 Query Cache 查找,查找操作虽然比较简单,但仍然也是要消耗一些 CPU 运算资源的。而由于Query Cache 的失效机制的特性,可能由于表上的数据变化比较频繁,大量的Query Cache频繁的被失效,所以 Query Cache 的命中率就可能比较低下。所以有些场景下,Query Cache 不仅不能提高效率,反而可能造成负面影响。

-- 设置VARIABLES
SHOW VARIABLES LIKE ‘%query_cache%‘;

SELECT 1048576/1024/1024;-- 1M大小
SELECT 4096/1024;-- 4K大小

query_cache_limit 单条语句缓存大小
query_cache_min_res_unit 每次分配的最小内存空间
query_cache_size 总的缓存大小
query_cache_wlock_invalidate 写锁定的时候是否立即让缓存失效,否则取得就是缓存数据 不是最新数据

-- 获取STATUS
SHOW GLOBAL STATUS LIKE ‘%Qcache%‘

SELECT 557688/1024/1024

Qcache_hits 缓存命中次数
Qcache_inserts 缓存新插入 即理解没有命中的次数

-- 关于查看INNODB 存储引擎

SHOW ENGINE INNODB STATUS;

SHOW VARIABLES LIKE ‘%innodb_version%‘
SHOW VARIABLES LIKE ‘%innodb_%io_threads%‘;

时间: 2024-08-09 23:49:18

1011MySQL Query Cache学习笔记的相关文章

【Query处理学习笔记】搜索引擎查询推荐技术综述_中文信息学报2010_王斌

主要内容:对通用搜索引擎的查询推荐技术的方法.评价进行了总结 具体内容: "查询推荐"的不同英文叫法:Query Suggestion.Term Suggestion.Query Recommendation.Query Substitution.Query Rewriting 查询推荐的任务:找出和用户查询相似的query,以便更好地表达用户查询意图,供用户便捷输入 三种技术方法: 1. 基于文档的方法:通过处理query搜索出来的文档,以此作为反馈,进一步理解用户意图,扩充quer

Cache学习笔记汇总

鲁春利的工作笔记,好记性不如烂笔头 Ehcache学习笔记(一)基础入门 http://luchunli.blog.51cto.com/2368057/1726800 Ehcache学习笔记(二)基础入门

Query Mobile学习笔记

1.获取jQuery mobile 文件,访问jQuerymobile网站下载 (貌似使用jquery mobile后,jquery会自动在网页中添加一些class类,第一次知道的我是被吓呆的!!) 2.需要使用数据属性,数据属性是HTML5引入的,以data-开头 比如data-role可以用于定义页眉,页脚,内容,页面等 data-role="page" 是在浏览器中显示的页面. data-role="header" 是在页面顶部创建的工具条 (通常用于标题或者

lucene学习笔记(二)

package index; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIn

Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)

所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的垂直搜索引擎,专门为用户提供团购.优惠券的检索:同时存在一个通用的搜索引擎,比如百度,通用搜索引擎希望能够识别出一个Query是否具有O2O检索意图,如果有则调用O2O垂直搜索引擎,获取结果作为通用搜索引擎的结果补充. 我们的目的是学习出一个分类器(classifier),分类器可以理解为一个函数,

dojo 学习笔记之dojo.query - query(id) 与query(class)的区别

考虑这个例子:动态创建一个页面的时候,用new listtem()生成多个listitem, 且每个listitem中都生成一个按钮button. 如果想要给每个按钮都绑定一个click事件,用dojo.query来获取这些button是比较方便的. 这样做的时候我遇到一个问题, 在create这些button的循环语句中我给每个button 定义了id = "somebtn" . 然后试图用var btnlist = dojo.query("#somebtn")

Dynamic CRM 2015学习笔记(5)CRM 2015 导入 OData Query Designer 解决方案

以前一直使用OData Query Designer来生成.验证odata查询字符串,本想把它导入到CRM 2015的环境里,但报错: 到MSDN上发现太老版本的solution确实不能再导入到crm 2015了: 因为这个工具是crm2011版本的,根据上面的图示,我们必须把它先导到crm 2013,再在crm 2013里导出成6.1version的,这时就可以导入到crm 2015里了.但我导到crm 2013里后,再想导出时问题来了,不能导出,因为是manage的solution.必须是u

Symfony2学习笔记之HTTP Cache

富web应用程序的本质意味着它们的动态.无论你的应用程序多么有效率,每个请求比起静态文件来说总会存在很多的耗费.对于大多数web程序来说,这没什么. Symfony2非常的轻快,无论你做些严重超载的请求,每个请求将会得到很快的回复,而不会对你的服务器造成压力.但是随着你站点的成长,负载将成为一个严重的问题.对每个请求处理应该只被正常执行一次.这就是缓存真正要达成的目标. 站在巨人肩膀上的缓存:提高一个应用程序执行效率的最有效方法是缓存一个页面的所有输出然后让后续的请求绕开整个应用程序.当然,这对

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------