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 数量
下面是从该文章,摘录的常见问题。
- Query Cache 如何处理子查询的?
这是我遇到的最为常见的一个问题。其实 Query Cache 是以客户端请求提交的 Query 为对象来处理的,只要客户端请求的是一个 Query,无论这个 Query 是一个简单的单表查询还是多表 Join,亦或者是带有子查询的复杂SQL,都被当作成一个 Query,不会被分拆成多个 Query 来进行 Cache。所以,存在子查询的复杂 Query 也只会产生一个Cache对象,子查询不会产生单独的Cache内容。UNION[ALL] 类型的语句也同样如此。
- Query Cache 是以 block 的方式存储的数据块吗?
不是,Query Cache 中缓存的内容仅仅只包含该 Query 所需要的结果数据,是结果集。当然,并不仅仅只是结果数据,还包含与该结果相关的其他信息,比如产生该 Cache 的客户端连接的字符集,数据的字符集,客户端连接的Default Database等。
- Query Cache 为什么效率会非常高,即使所有数据都可以 Cache 进内存的情况下,有些时候也不如使用 Query Cache 的效率高?
Query Cache的查找,是在MySQL接受到客户端请求后在对Query进行权限验证之后,SQL解析之前。也就是说,当 MySQL接受到客户端的SQL后,仅仅只需要对其进行相应的权限验证后就会通过Query Cache来查找结果,甚至都不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生任何存储引擎的交互,减少了大量的磁盘IO和CPU运算,所以效率非常高。
- 客户端提交的SQL语句大小写对 Query Cache有影响吗?
有,由于Query Cache在内存中是以HASH结构来进行映射,HASH 算法基础就是组成SQL语句的字符,所以必须要整个 SQL语句在字符级别完全一致,才能在Query Cache中命中,即使多一个空格也不行。
- 一个SQL语句在Query Cache中的内容,在什么情况下会失效?
为了保证Query Cache中的内容与是实际数据绝对一致,当表中的数据有任何变化,包括新增,修改,删除等,都会使所有引用到该表的SQL的Query Cache失效。
- 为什么我的系统在开启了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%';
1011MySQL Query Cache学习笔记的更多相关文章
- Query Mobile学习笔记
1.获取jQuery mobile 文件,访问jQuerymobile网站下载 (貌似使用jquery mobile后,jquery会自动在网页中添加一些class类,第一次知道的我是被吓呆的!!) ...
- SQL学习笔记
SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...
- ArcGIS API for JavaScript 4.2学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】
有人问我怎么这个系列没有写自己做的东西呢? 大哥大姐,这是"学习笔记"啊!当然主要以解读和笔记为主咯. 也有人找我要实例代码(不是示例),我表示AJS尚未成熟,现在数据编辑功能才简 ...
- Dynamic CRM 2015学习笔记(5)CRM 2015 导入 OData Query Designer 解决方案
以前一直使用OData Query Designer来生成.验证odata查询字符串,本想把它导入到CRM 2015的环境里,但报错: 到MSDN上发现太老版本的solution确实不能再导入到crm ...
- MySQL学习笔记-cache 与 buffer
Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而 buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出的数据,后者是解决写 ...
- [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- X-Cart 学习笔记(四)常见操作
目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 五.常见 ...
- phalcon(费尔康)框架学习笔记
phalcon(费尔康)框架学习笔记 http://www.qixing318.com/article/phalcon-framework-to-study-notes.html 目录结构 pha ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
随机推荐
- 如何更改nginx网站根目录 以及解析php
nginx默认网站根目录为/usr/local/nginx/html,如果想要将它改成/data/www 需配置 vim /usr/local/nginx/conf/nginx.conf 将其中的字段 ...
- 使用::before和::after来完成尖角效果
一.目标 目标完成下图效果: 二.完成 1.分析 在::before和::after伪元素的用法一文中有说到使用::befrore和::after可以完成一个六边形.这个案例是用一个#star-six ...
- Uva 11395 Sigma Function (因子和)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=109329#problem/C 题目在文末 题意:1~n (n:1~1012)中,因子 ...
- VIJOS1476旅游规划[树形DP 树的直径]
描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...
- getline()函数
这是一篇关于getline()函数的博客,以总结对输入输出流的掌握,不再在这些问题上栽跟头~ -------------------------- 1.首先我们知道,getline()函数的基本作用, ...
- String 对象是不动态改变长度的
在java里 String 对象是不动态改变长度的,只有先转化成StringBuffer,插入处理后在转回. 如 StringBuffer str = new StringBuffer("T ...
- jmeter 监控服务器的内存,cpu等内容
1.需要下载一个jar包,放入到lib /ext文件中 JMeterPlugins-Standard.jar 2.在服务器上安装 perfmon server agent 这里监控内存我们使用的是: ...
- rqnoj28[stupid]愚蠢的宠物
题目描述 背景 大家都知道,sheep有两只可爱的宠物(一只叫神牛,一只叫神菜).有一天,sheep带着两只宠物到狗狗家时,这两只可爱的宠物竟然迷路了…… 描述 狗狗的家因为常常遭到猫猫的攻击,所以不 ...
- 配置Supervisor开机启动
配置Supervisor开机启动: 新建一个"supervisord.service"文件 # dservice for systemd (CentOS 7.0+) # by ET ...
- java的string常用操作
import java.util.*; public class Demo3 { public static void main(String args[]){ String str = " ...