MySQL的Query Cache原理分析

QueryCache(下面简称QC)是根据SQL语句来cache的。一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用QC。每个Cache都是以SQL文本作为key来存的。

原理
QueryCache(下面简称QC)是根据SQL语句来cache的。一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用QC。每个Cache都是以SQL文本作为key来存的。在应用QC之前,SQL文本不会被作任何处理。也就是说,两个SQL语句,只要相差哪怕是一个字符(例如大小写不一样;多一个空格等),那么这两个SQL将使用不同的一个CACHE。
不过SQL文本有可能会被客户端做一些处理。例如在官方的命令行客户端里,在发送SQL给服务器之前,会做如下处理:

过滤所有注释
去掉SQL文本前后的空格,TAB等字符。注意,是文本前面和后面的。中间的不会被去掉。

下面的三条SQL里,因为SELECT大小写的关系,最后一条和其他两条在QC里肯定是用的不一样的存储位置。而第一条和第二条,区别在于后者有个注释,在不同客户端,会有不一样的结果。所以,保险起见,请尽量不要使用动态的注释。在PHP的mysql扩展里,SQL的注释是不会被去掉的。也就是三条SQL会被存储在三个不同的缓存里,虽然它们的结果都是一样的。

select * FROM people where name=’surfchen’;
select * FROM people where /*hey~*/name=’surfchen’;
SELECT * FROM people where name=’surfchen’;
目前只有select语句会被cache,其他类似show,use的语句则不会被cache。

因为QC是如此前端,如此简单的一个缓存系统,所以如果一个表被更新,那么和这个表相关的SQL的所有QC都会被失效。假设一个联合查询里涉及到了表A和表B,如果表A或者表B的其中一个被更新(update或者delete),这个查询的QC将会失效。

也就是说,如果一个表被频繁更新,那么就要考虑清楚究竟是否应该对相关的一些SQL进行QC了。一个被频繁更新的表如果被应用了QC,可能会加重数据库的负担,而不是减轻负担。我一般的做法是默认打开QC,而对一些涉及频繁更新的表的SQL语句加上SQL_NO_CACHE关键词来对其禁用CACHE。这样可以尽可能避免不必要的内存操作,尽可能保持内存的连续性。

那些查询很分散的SQL语句,也不应该使用QC。例如用来查询用户和密码的语句——“select pass from user where name=’surfchen’”。这样的语句,在一个系统里,很有可能只在一个用户登陆的时候被使用。每个用户的登陆所用到的查询,都是不一样的SQL文本,QC在这里就几乎不起作用了,因为缓存的数据几乎是不会被用到的,它们只会在内存里占地方。

存储块
在本节里“存储块”和“block”是同一个意思
QC缓存一个查询结果的时候,一般情况下不是一次性地分配足够多的内存来缓存结果的。而是在查询结果获得的过程中,逐块存储。当一个存储块被填满之后,一个新的存储块将会被创建,并分配内存(allocate)。单个存储块的内存分配大小通过query_cache_min_res_unit参数控制,默认为4KB。最后一个存储块,如果不能被全部利用,那么没使用的内存将会被释放。如果被缓存的结果很大,那么会可能会导致分配内存操作太频繁,系统系能也随之下降;而如果被缓存的结果都很小,那么可能会导致内存碎片过多,这些碎片如果太小,就很有可能不能再被分配使用。

除了查询结果需要存储块之外,每个SQL文本也需要一个存储块,而涉及到的表也需要一个存储块(表的存储块是所有线程共享的,每个表只需要一个存储块)。存储块总数量=查询结果数量*2+涉及的数据库表数量。也就是说,第一个缓存生成的时候,至少需要三个存储块:表信息存储块,SQL文本存储块,查询结果存储块。而第二个查询如果用的是同一个表,那么最少只需要两个存储块:SQL文本存储块,查询结果存储块。

通过观察Qcache_queries_in_cache和Qcache_total_blocks可以知道平均每个缓存结果占用的存储块。它们的比例如果接近1:2,则说明当前的query_cache_min_res_unit参数已经足够大了。如果Qcache_total_blocks比Qcache_queries_in_cache多很多,则需要增加query_cache_min_res_unit的大小。

Qcache_queries_in_cache*query_cache_min_res_unit(sql文本和表信息所在的block占用的内存很小,可以忽略)如果远远大于query_cache_size-Qcache_free_memory,那么可以尝试减小query_cache_min_res_unit的值。

调整大小
如果Qcache_lowmem_prunes增长迅速,意味着很多缓存因为内存不够而被释放,而不是因为相关表被更新。尝试加大query_cache_size,尽量使Qcache_lowmem_prunes零增长。
启动参数
show variables like ‘query_cache%’可以看到这些信息。
query_cache_limit:如果单个查询结果大于这个值,则不Cache
query_cache_size:分配给QC的内存。如果设为0,则相当于禁用QC。要注意QC必须使用大约40KB来存储它的结构,如果设定小于40KB,则相当于禁用QC。QC存储的最小单位是1024 byte,所以如果你设定了一个不是1024的倍数的值,这个值会被四舍五入到最接近当前值的等于1024的倍数的值。
query_cache_type:0 完全禁止QC,不受SQL语句控制(另外可能要注意的是,即使这里禁用,上面一个参数所设定的内存大小还是会被分配);1启用QC,可以在SQL语句使用SQL_NO_CACHE禁用;2可以在SQL语句使用SQL_CACHE启用。
query_cache_min_res_unit:每次给QC结果分配内存的大小
状态
show status like ‘Qcache%’可以看到这些信息。
Qcache_free_blocks:当一个表被更新之后,和它相关的cache blocks将被free。但是这个block依然可能存在队列中,除非是在队列的尾部。这些blocks将会被统计到这个值来。可以用FLUSH QUERY CACHE语句来清空free blocks。
Qcache_free_memory:可用内存,如果很小,考虑增加query_cache_size
Qcache_hits:自mysql进程启动起,cache的命中数量
Qcache_inserts:自mysql进程启动起,被增加进QC的数量
Qcache_lowmem_prunes:由于内存过少而导致QC被删除的条数。加大query_cache_size,尽可能保持这个值0增长。
Qcache_not_cached:自mysql进程启动起,没有被cache的只读查询数量(包括select,show,use,desc等)
Qcache_queries_in_cache:当前被cache的SQL数量
Qcache_total_blocks:在QC中的blocks数。一个query可能被多个blocks存储,而这几个blocks中的最后一个,未用满的内存将会被释放掉。例如一个QC结果要占6KB内存,如果query_cache_min_res_unit是4KB,则最后将会生成3个blocks,第一个block用来存储sql语句文本,这个不会被统计到query+cache_size里,第二个block为4KB,第三个block为2KB(先allocate4KB,然后释放多余的2KB)。每个表,当第一个和它有关的SQL查询被CACHE的时候,会使用一个block来存储表信息。也就是说,block会被用在三处地方:表信息,SQL文本,查询结果。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/814340.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python地信专题 | 基于geopandas的空间数据分析-文件IO篇
上一篇 2025年11月27日 00:20:04
微软爽歪歪,Win10预览版用户数量暴增
下一篇 2025年11月27日 00:20:06

相关推荐

  • 小红书网页版怎么分析数据_小红书网页版笔记数据分析方法

    小红书网页版怎么分析数据_小红书网页版笔记数据分析方法小红书网页版怎么分析数据_小红书网页版笔记数据分析方法小红书网页版怎么分析数据_小红书网页版笔记数据分析方法小红书网页版怎么分析数据_小红书网页版笔记数据分析方法

    首先登录小红书网页版,进入“创作中心”可查看账号数据概览;在“笔记管理”中点击“数据分析”按钮,能获取单条笔记的曝光来源、用户画像及访问趋势等详细信息。 小红书网页版数据分析入口如何查找? 小红书网页版怎么分析数据?这是许多内容创作者和品牌运营者关注的问题,接下来由PHP小编为大家带来小红书网页版笔…

    2026年9月26日 • 用户投稿
    000
  • 京东商户需要提供仓库信息吗_京东商户仓库信息填写及物流要求指南

    京东商户需要提供仓库信息吗_京东商户仓库信息填写及物流要求指南京东商户需要提供仓库信息吗_京东商户仓库信息填写及物流要求指南京东商户需要提供仓库信息吗_京东商户仓库信息填写及物流要求指南京东商户需要提供仓库信息吗_京东商户仓库信息填写及物流要求指南

    京东商户需根据自营或POP模式确定仓库责任,POP商家须在后台填写真实仓库信息并选择物流方式,确保24小时内发货以满足平台时效要求。 如果您计划在京东平台开设店铺并提供商品,平台会根据您的经营模式对仓储和物流提出相应要求。不同的合作模式决定了您是否需要自行提供仓库信息以及具体的物流执行方式。以下是关…

    2026年9月26日 • 用户投稿
    100
  • MBTI测试免费官网入口_ MBTI性格测试免费网站链接

    MBTI测试免费官网入口_ MBTI性格测试免费网站链接MBTI测试免费官网入口_ MBTI性格测试免费网站链接MBTI测试免费官网入口_ MBTI性格测试免费网站链接MBTI测试免费官网入口_ MBTI性格测试免费网站链接

    MBTI测试免费官网入口是http://www.16personalities.com/ch,该平台提供免注册的中文测试,包含性格分析、职业建议与成长指导,并支持报告下载。 MBTI测试免费官网入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来MBTI性格测试免费网站链接,感兴趣的网友一…

    2026年9月26日 • 用户投稿
    100
  • KOOK客户端下载登录 _ Kook官网网页版链接分享

    KOOK客户端下载登录 _ Kook官网网页版链接分享KOOK客户端下载登录 _ Kook官网网页版链接分享KOOK客户端下载登录 _ Kook官网网页版链接分享KOOK客户端下载登录 _ Kook官网网页版链接分享

    KOOK客户端下载登录入口在官网https://www.kookapp.cn/,支持多端同步登录、高清语音通话、文字频道管理及自定义机器人功能。 KOOK客户端下载登录入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来KOOK官网网页版链接分享,感兴趣的网友一起随小编来瞧瞧吧! http…

    2026年9月26日 • 用户投稿
    200
  • Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制

    Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制Spring Security中自定义过滤器与JWT认证过滤器的执行顺序控制

    在Spring Security应用中,确保自定义过滤器(如多租户过滤器)在JWT认证/授权过滤器之前正确执行至关重要。本文将深入探讨如何通过@Order注解和SecurityFilterChain配置,精确控制自定义OncePerRequestFilter的执行顺序,使其优先于Spring Sec…

    2026年9月26日 • 用户投稿
    100
  • Debian上GitLab的数据库选择

    在debian上部署gitlab时,您可以选择多种数据库。根据搜索结果,以下是几种常见的数据库选择及其相关信息: SQLite 特点:SQLite是一种轻量级的嵌入式数据库管理系统,设计简单,占用空间小,易于使用,不需要独立的数据库服务器。适用场景:适用于小型应用程序或需要在嵌入式设备上运行的应用程…

    2026年9月26日
    800
  • MySQL中正则表达式应用 REGEXP在复杂条件查询中的用法

    mysql 中 regexp 可用于模糊匹配不确定的字符串结构,比 like 更强大。1. 使用 | 匹配多个可能值,如 ‘apple|orange’ 表示“或”关系;2. 用 ^ 和 $ 分别匹配开头和结尾内容,如 ‘^user_’ 或 &#8216…

    2026年9月26日
    100
  • Java微服务分布式事务实战:TCC模式与Seata框架深度整合

    Java微服务分布式事务实战:TCC模式与Seata框架深度整合Java微服务分布式事务实战:TCC模式与Seata框架深度整合Java微服务分布式事务实战:TCC模式与Seata框架深度整合Java微服务分布式事务实战:TCC模式与Seata框架深度整合

    TCC模式结合Seata框架是微服务中实现分布式事务的可靠方案,通过Try-Confirm-Cancel机制将事务控制提升至业务层,Seata以@GlobalTransactional和@TwoPhaseBusinessAction注解简化事务协调,实现资源的预留、确认与回滚,解决数据一致性难题。 …

    2026年9月26日 • 用户投稿
    200
  • 怎样在MySQL中定义性别字段的数据类型?

    怎样在MySQL中定义性别字段的数据类型?怎样在MySQL中定义性别字段的数据类型?怎样在MySQL中定义性别字段的数据类型?怎样在MySQL中定义性别字段的数据类型?

    在MySQL中定义性别字段的数据类型一般可以使用ENUM类型。ENUM类型可以将字段的值限定在一个指定的值列表中,这样可以确保只能存储预先定义的值。 下面是一个示例代码,演示了如何在MySQL中定义一个包含性别信息的表,并设置性别字段的数据类型为ENUM类型: — 创建包含性别信息的表CREATE…

    2026年9月26日 • 用户投稿
    100
  • MySQL中前缀索引的优势和用法

    MySQL中前缀索引的优势和用法MySQL中前缀索引的优势和用法MySQL中前缀索引的优势和用法MySQL中前缀索引的优势和用法

    MySQL中前缀索引的优势和用法 在MySQL数据库中,索引是提高查询效率的重要手段之一。除了常见的全字段索引外,还有一种特殊的索引叫做前缀索引。本文将介绍前缀索引的优势和用法,并附上具体的代码示例。 1. 什么是前缀索引 前缀索引即只对字段的前几个字符进行索引,而不是整个字段内容。这样做的优势在于…

    2026年9月26日 • 用户投稿
    100
  • MySQL数据库中性别字段应该使用什么数据类型?

    MySQL数据库中性别字段应该使用什么数据类型?MySQL数据库中性别字段应该使用什么数据类型?MySQL数据库中性别字段应该使用什么数据类型?MySQL数据库中性别字段应该使用什么数据类型?

    在MySQL数据库中,性别字段通常可以使用ENUM类型来存储。ENUM是一种枚举类型,它允许我们在一组预定义的值中选择一个作为字段的值。在表示性别这样一个固定且有限的选项时,ENUM是一个很好的选择。 让我们来看一个具体的代码示例: 假设我们有一个名为”users”的表,其中…

    2026年9月26日 • 用户投稿
    300
  • php数据库如何删除记录 php数据库DELETE操作的安全规范

    使用预处理语句可防止SQL注入,确保删除操作安全;应验证用户输入、检查ID合法性,避免直接拼接参数;通过权限校验确认数据归属,防止越权删除;建议采用软删除或二次确认机制,避免误删;DELETE必须包含WHERE条件,禁止无条件删除整表;结合事务与日志审计提升安全性。 在PHP中操作数据库删除记录时,…

    2026年9月26日
    100
  • MySQL如何实现数据分区 范围分区与哈希分区实战

    MySQL如何实现数据分区 范围分区与哈希分区实战MySQL如何实现数据分区 范围分区与哈希分区实战MySQL如何实现数据分区 范围分区与哈希分区实战MySQL如何实现数据分区 范围分区与哈希分区实战

    mysql实现数据分区的常见方式有范围分区和哈希分区。1. 范围分区适合按时间、数值等有明确界限的数据划分,例如按年份对销售表进行分区,能提高查询效率并方便管理;2. 哈希分区适合需要均匀分布数据的场景,如按用户id进行分区,避免数据倾斜。选择分区方式需根据数据特点判断:范围分区查询特定范围高效但可…

    2026年9月26日 • 用户投稿
    200
  • 小红书网页版怎么添加商品_小红书网页版电商功能使用教程

    小红书网页版怎么添加商品_小红书网页版电商功能使用教程小红书网页版怎么添加商品_小红书网页版电商功能使用教程小红书网页版怎么添加商品_小红书网页版电商功能使用教程小红书网页版怎么添加商品_小红书网页版电商功能使用教程

    小红书网页版添加商品需先登录官网,进入商家中心完成认证后,在商品管理页面填写信息、上传图片、设置价格库存并完善详情描述,最后通过优化标题关键词、关联话题标签、更新封面图、发布种草笔记及参与促销活动提升曝光。 小红书网页版怎么添加商品?这是不少网友都关注的,接下来由PHP小编为大家带来小红书网页版电商…

    2026年9月26日 • 用户投稿
    600
  • MySQL存储过程:提升数据处理效率的利器

    MySQL存储过程:提升数据处理效率的利器MySQL存储过程:提升数据处理效率的利器MySQL存储过程:提升数据处理效率的利器MySQL存储过程:提升数据处理效率的利器

    MySQL存储过程:提升数据处理效率的利器 在现代数据库管理系统中,存储过程是一种被广泛应用的数据处理工具,用于提高数据库操作的效率和灵活性。MySQL作为一种流行的关系型数据库管理系统,也支持存储过程的使用。本文将介绍MySQL存储过程的基本概念、优势以及具体的代码示例,以帮助读者更好地理解和应用…

    2026年9月26日 • 用户投稿
    100
  • PHP特殊字符转义怎么做_PHP处理HTML特殊字符转义的函数

    htmlspecialchars()用于转义HTML特殊字符以防止XSS攻击,仅处理&”‘五种字符,配合ENT_QUOTES和UTF-8编码可确保安全;htmlentities()则转义所有可表示的字符,适用于多语言场景;输出前应使用这些函数对数据进行转义,但需避免重…

    2026年9月26日
    200
  • 深入理解MySQL存储过程的应用场景

    深入理解MySQL存储过程的应用场景深入理解MySQL存储过程的应用场景深入理解MySQL存储过程的应用场景深入理解MySQL存储过程的应用场景

    深入理解MySQL存储过程的应用场景 MySQL是一种常用的关系型数据库管理系统,广泛应用于各种Web应用和企业信息系统中。存储过程是MySQL中一种重要的数据库对象,它是一组预先编译好的SQL语句和数据处理逻辑的集合,可以被多次调用和重复使用。 存储过程的应用场景非常广泛,它可以用来简化复杂的数据…

    2026年9月26日 • 用户投稿
    000
  • 查询本机IP地址指南—实用教程解析本地网络IP方法

    查询本机IP地址指南—实用教程解析本地网络IP方法查询本机IP地址指南—实用教程解析本地网络IP方法查询本机IP地址指南—实用教程解析本地网络IP方法查询本机IP地址指南—实用教程解析本地网络IP方法

    先查内网IP可使用命令提示符输入ipconfig,或通过系统设置查看网络属性;查公网IP则在浏览器搜索“我的IP”或访问ip.cn等网站即可。 想知道自己的电脑IP地址在哪看?其实方法很简单,主要分清你要查的是内网IP还是公网IP。内网IP是你在家庭或公司局域网里的身份标识,而公网IP是你的网络在互…

    2026年9月26日 • 用户投稿
    400
  • MySQL中布尔类型的优缺点分析

    MySQL中布尔类型的优缺点分析MySQL中布尔类型的优缺点分析MySQL中布尔类型的优缺点分析MySQL中布尔类型的优缺点分析

    MySQL中布尔类型的优缺点分析 MySQL是一种流行的关系型数据库管理系统,其中布尔类型是一种常见的数据类型之一。在MySQL中,布尔类型用来存储逻辑值,通常表示真(true)或假(false)。在本文中将对MySQL中布尔类型的优缺点进行分析,同时会提供具体的代码示例来帮助读者更好地理解。 优点…

    2026年9月26日 • 用户投稿
    100
  • 深入理解MySQL触发器的参数设置

    深入理解MySQL触发器的参数设置深入理解MySQL触发器的参数设置深入理解MySQL触发器的参数设置深入理解MySQL触发器的参数设置

    MySQL 触发器是一种在数据库表中定义的一系列操作,当满足特定条件时自动触发执行。触发器可以在 insert、update 或 delete 操作前或后执行一些特定的SQL语句,以实现数据变化时的自动化处理。触发器的参数设置对于正确的使用和效率优化非常重要,本文将深入探讨MySQL触发器的参数设置…

    2026年9月26日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信