mysql数据库查询缓存总结
概述
查询缓存(Query Cache,简称QC),存储SELECT语句及其产生的数据结果。闲来无事,做一下这块的总结,也做个备忘!
工作原理
查询缓存工作原理如下:
缓存SELECT操作的结果集和SQL语句,key为sql,value为查询结果集;
如果新的SELECT语句到了,以这个sql为key去缓存中查询,如果匹配,就把缓存的结果集返回;
匹配标准:与缓存的SQL语句是否完全一样,sql中字母区分大小写以及中间的空格,简单理解为存储了一个key-value结构,key为sql,value为sql查询结果,匹配时使用Java的String的equals(),例如:
select age from user 与 select AGE from user不会匹配,因为大小写不同;
select age from use 与 select age from user不会匹配,因为空格不同;
sql两边的空格可忽略,可以认为是对key进行过trim操作之后再进行equals比较。
查看mysql设置参数
执行
show variables like '%query_cache%';
可以看到相关参数:
query_cache_type:0-不启用查询缓存;1-启用,2-启用,默认值为0;
query_cache_size:设置缓存区总大小,允许设置query_cache_size的值最小为40K,默认1M,推荐设置为:64M/128M;
query_cache_limit:限制缓存区最大能缓存的单条查询记录集大小,默认设置为1M
query_cache_type为1时,只要符合查询缓存的要求,客户端的查询语句和记录集都可以缓存起来,如果SQL中加上 SQL_NO_CACHE将不缓存;
query_cache_type为2时,只要SQL中添加了参数:SQL_CACHE,且符合查询缓存的要求,客户端的查询语句和记录集,则可以缓存起来。
查看缓存使用情况
show status like '%Qcache%%';
可以看到相关参数:
Qcache_hits:缓存命中次数;
Qcache_inserts:缓存中插入次数,每缓存一次加1,注意这个不是缓存数量;
开启查询缓存
设置选项query_cache_type = 1 ,同时设置query_cache_size = 67108864;
注:query_cache_size的值设置在100MB以内即可。在MySQL里查询缓存是由一个全局锁在控制,每次更新查询缓存的内存块都需要进行锁定。
关闭查询缓存
设置选项query_cache_type = 0,同时设置query_cache_size = 0。
适用场景
用于频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变化的信息。
由于查询缓存需要缓存最新数据结果,因此表数据发生任何变化(insert、update、delete或其他可能产生数据变化的操作),都会导致查询缓存被刷新。因而,对于一个更新频率非常低而只读查询频率非常高的场景下,打开查询缓存还是比较有优势的。
不适用场景
查询缓存严格要求2次SQL请求要完全一样,包括SQL语句,连接的数据库、协议版本、字符集等因素都会影响。下面为查询缓存不适用的几个场景:
- 子查询;
- 过程、函数、触发器、event中调用的SQL,或者引用到这些结果的;
- 查询中涉及一些特殊函数时,例如:BENCHMARK()、CURDATE()、CURRENT_TIME()、CURRENT_TIMESTAMP()、NOW()、SLEEP()、CONNECTION_ID()、CURRENT_DATE()、CURRENT_USER()、PASSWORD()、RAND()、UUID()、ENCRYPT()、LAST_INSERT_ID()等等;
- 查询涉及到mysql,information_schema或performance_schema。
- 类似SELECT…LOCK IN SHARE MODE、SELECT…FOR UPDATE、SELECT..INTO OUTFILE/DUMPFILE、SELECT * FROM ... WHERE autoincrement_col IS NULL的查询;
- SELECT执行计划用到临时表;
- 未引用任何表的查询,例如SELECT 1+2;
- 查询产生了告警(warnings);
- SELECT语句中存在SQL_NO_CACHE关键字;
- 涉及到分区表。
可见,使用查询的缓存的限制非常多。当使用场景中以只读为主,很少有更新的情况时,再考虑开启查询缓存。
mysql数据库查询缓存总结的更多相关文章
- mysql的查询缓存模式介绍
mysql的查询缓存 查询是数据库技术中最常用的操作.查询操作的过程比较简单,首先从客户端发出查询的SQL语句,数据库服务端在接收到由客户端发来的 SQL语句后, 执行这条SQL语句,然后将查询到的结 ...
- mysql数据库查询过程探究和优化建议
查询过程探究 我们先看一下向mysql发送一个查询请求时,mysql做了什么? 如上图所示,查询执行的过程大概可分为6个步骤: 客户端向MySQL服务器发送一条查询请求 服务器首先检查查询缓存,如果命 ...
- MySQL关闭查询缓存(QC)的两种方法
MySQL Query Cache 会缓存select 查询,安装时默认是开启的,但是如果对表进行INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP ...
- mysql数据库查询pdo的用法
最早的php对mysql数据库查询是mysql和mysqli方法,后来php的新版本进一步封住了该方法,于是又pdo,抛开php框架,使用pdo查询数据,使用也是相当简便 <?php ini_s ...
- 提高MySQL数据库查询效率的几个技巧(转载)
[size=5][color=Red]提高MySQL数据库查询效率的几个技巧(转)[/color][/size] MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我 ...
- 将从mysql数据库查询的信息,遍历到List<>以及一些随机数的生成
将从mysql数据库查询的信息,遍历到List<>以及一些随机数的生成. 代码比较乱,但是方法还是对的,大家又需要的选择看,希望对博友 有帮助,欢迎留言分享! public class s ...
- MySQL 数据库查询数据,过滤重复数据保留一条数据---(MySQL中的row_number变相实现方法)
转自: http://www.maomao365.com/?p=10564 摘要: 下文讲述MySQL数据库查询重复数据时,只保留一条数据的方法 实现思路: 在MySQL数据库中没有row_numbe ...
- 关于ORACLE的硬解析和软解析与MySQL的查询缓存query_cache探讨
今天在项目中探讨到Oracle对于SQL语句的解析方法以及MySQL相应的处理方法: --------------------------------------------------------- ...
- mysql的查询缓存
查询是数据库技术中最常用的操作.查询操作的过程比较简单,首先从客户端发出查询的SQL语句,数据库服务端在接收到由客户端发来的 SQL语句后, 执行这条SQL语句,然后将查询到的结果返回给客户端 ...
随机推荐
- 请关注订阅号,获取demo,学术讨论
- PMP 第4章错题总结
变更步骤: 1.配置管理活动:配置识别.配置状态记录.配置核实与审计2.项目章程中记录项目的目的和总体预算3.变更控制系统规定了变更管理流程及批准的权限4.项目章程是授权项目经理动用组织资源的文件5. ...
- 记一次偶发的bug排查——redis-py-cluster库的bug
排查流水账: 通过平台监控,发现很多偶发的查看推荐列表的接口时延大于0.5s 写单元测试,不能重现.在测试环境不能重现.只有在正式环境可以偶发重现. 通过日志埋点,等待重现 不断地加日志埋点后发现耗 ...
- 使用Skywalking分布式链路追踪系统
使用Skywalking分布式链路追踪系统 https://www.cnblogs.com/sunyuliang/p/11424848.html 当我们用很多服务时,各个服务间的调用关系是怎么样的?各 ...
- Android MVP模式简单介绍:以一个登陆流程为例
老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚.简洁,流程更加清晰,对于后续版本迭代维护都挺方便.对于一些想要学习MVP模式的同学来讲,百度搜出来 ...
- 基于Livy的Spark提交平台搭建与开发
为了方便使用Spark的同学提交任务以及加强任务管理等原因,经调研采用Livy比较靠谱,下图大致罗列一下几种提交平台的差别. 本文会以基于mac的单机环境搭建一套Spark+Livy+Hadoop来展 ...
- SQL Server 将数据导出为XML和Json
有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做,而SQ ...
- GitLabCICD
CI/CD是什么 CI全名Continuous Integration,啥意思?就是我们经常听到的持续集成概念.当开发每天会提交多次代码到主干上,会做一些重复性的动作时,就可以用持续集成环境来操作.有 ...
- Jenkins版本迭代以及回滚
一.摘要 在上一篇文章,链接如下: https://www.cnblogs.com/xiao987334176/p/11434849.html 镜像打的是latest版,如果需要回滚的话,就比较麻烦了 ...
- Docker 使用入门 Hello World
结合上一篇的所说的内容:现在安装好了Docker 安装好了就要用嘛,所以,先走一个Hello World docker run ubuntu:15.10 /bin/echo "hello w ...