MySQL查询缓存详解

embedded/2024/11/28 6:18:39/

一、查询缓存的基本概念

MySQL 的查询缓存是一种用于存储查询结果的内存区域。当一个查询被执行时,MySQL 首先检查查询缓存中是否已经存在相同的查询结果。如果存在,直接从查询缓存中返回结果,而无需再次执行查询语句,从而大大提高查询性能。

二、查询缓存的工作原理

  1. 缓存存储

    • 查询缓存存储的是完整的查询语句和对应的查询结果。当一个查询被执行时,MySQL 会将查询语句进行哈希计算,生成一个唯一的哈希值。这个哈希值作为查询缓存的键,查询结果作为值存储在缓存中。
    • 例如,对于查询 SELECT * FROM users WHERE age > 30,MySQL 会计算这个查询语句的哈希值,并将查询结果与这个哈希值一起存储在查询缓存中。
  2. 缓存命中判断

    • 当一个新的查询到来时,MySQL 同样会对查询语句进行哈希计算,然后在查询缓存中查找是否存在相同的哈希值。如果找到,并且查询语句和缓存中的查询完全一致(包括大小写、注释等),则认为是缓存命中,直接返回缓存中的结果。
    • 例如,如果再次执行 SELECT * FROM users WHERE age > 30,MySQL 会计算哈希值并在查询缓存中查找,发现有相同的哈希值且查询语句一致,就会从缓存中返回结果。
  3. 缓存失效

    • 查询缓存并不是永久有效的,当以下情况发生时,查询缓存会失效:
      • 表数据发生变化:当查询涉及的表中的数据被插入、更新或删除时,与该表相关的所有查询缓存都会被标记为无效,并从缓存中移除。这是因为表数据的变化可能导致查询结果不再准确。
      • 查询语句发生变化:即使是微小的变化,如添加注释、改变大小写等,也会导致查询缓存不命中。因为 MySQL 对查询语句的一致性要求非常严格。
      • 缓存空间不足:当查询缓存的内存空间不足时,MySQL 会根据一定的算法淘汰一些旧的缓存数据,为新的查询结果腾出空间。

三、查询缓存的使用场景

  1. 静态数据查询

    • 对于那些数据不经常变化的表,查询缓存非常有用。例如,一个存储配置信息的表,或者一个包含国家代码、货币符号等静态数据的表。因为这些表的数据很少变化,查询结果可以长时间缓存在内存中,提高查询性能。
    • 例如,一个企业的系统配置表,可能包含一些固定的参数设置,如邮件服务器地址、数据库连接字符串等。这些数据通常在系统运行期间很少变化,查询这些表时可以充分利用查询缓存
  2. 频繁执行的相同查询

    • 如果一个查询被频繁执行,并且查询结果相对稳定,那么查询缓存可以显著提高性能。例如,一个报表系统中,可能有一些复杂的查询需要定期执行,这些查询的结果在一段时间内通常是不变的,将这些查询结果缓存起来可以大大减少查询执行时间。
    • 例如,一个电商网站的销售报表查询,每天凌晨生成前一天的销售数据报表,这个查询可能会被频繁执行,并且在一天内销售数据通常不会发生大的变化,查询缓存可以提高报表生成的速度。

四、查询缓存的优缺点

  1. 优点

    • 提高查询性能:对于那些能够命中查询缓存的查询,可以极大地减少查询执行时间,特别是对于复杂的查询和频繁执行的查询,效果尤为明显。
    • 减少数据库负载:由于查询可以直接从缓存中获取结果,减少了对数据库的实际查询次数,从而降低了数据库的负载,提高了数据库的整体性能。
  2. 缺点

    • 缓存管理开销:查询缓存需要额外的内存空间来存储查询结果,并且需要一定的管理开销来维护缓存的有效性。当表数据频繁变化时,缓存的失效和更新会带来额外的开销。
    • 可能导致数据不一致:如果查询缓存中的数据没有及时更新,可能会导致查询结果与实际数据不一致。特别是在高并发环境下,数据的变化可能非常频繁,查询缓存可能无法及时反映这些变化。
    • 不适合动态数据:对于那些数据经常变化的表,查询缓存的效果不佳,甚至可能会降低性能。因为每次数据变化都会导致相关的查询缓存失效,增加了系统的开销。

五、查询缓存的管理和优化

  1. 开启和关闭查询缓存

    • 查询缓存可以通过在 MySQL 配置文件中设置 query_cache_type 参数来开启或关闭。默认情况下,查询缓存是开启的,但在一些高并发、数据频繁变化的环境中,可能需要关闭查询缓存以提高系统性能。
    • 例如,可以在 my.cnf 文件中设置 query_cache_type = 0 来关闭查询缓存,设置 query_cache_type = 1 或 2 来开启查询缓存1 表示按需缓存2 表示始终缓存)。
  2. 监控查询缓存的性能

    • 可以通过查看 MySQL 的状态变量来监控查询缓存的性能。例如,Qcache_hits 表示查询缓存命中的次数,Qcache_inserts 表示查询缓存插入的次数,Qcache_lowmem_prunes 表示由于内存不足而被删除的查询缓存次数。
    • 通过监控这些变量,可以了解查询缓存的使用情况,判断查询缓存是否对系统性能有积极的影响。如果发现查询缓存的命中率很低,或者由于内存不足而频繁删除缓存,可能需要考虑调整查询缓存的大小或者关闭查询缓存
  3. 调整查询缓存的大小

    • 查询缓存的大小可以通过 query_cache_size 参数来设置。默认情况下,查询缓存的大小为 1MB,可以根据系统的实际需求进行调整。
    • 如果系统中有大量的查询需要缓存,并且内存资源充足,可以适当增大查询缓存的大小,以提高缓存命中率。但是,过大的查询缓存也会占用过多的内存资源,可能会影响其他数据库进程的性能。因此,需要根据系统的实际情况进行合理的调整。

六、总结

MySQL 的查询缓存是一个强大的工具,可以在一定程度上提高查询性能。但是,它也有一些局限性,不适合所有的应用场景。在使用查询缓存时,需要根据系统的实际情况进行合理的配置和优化,以充分发挥其优势,同时避免其带来的负面影响。通过正确地管理和优化查询缓存,可以提高 MySQL 数据库的性能和响应速度,为用户提供更好的服务体验。


http://www.ppmy.cn/embedded/141117.html

相关文章

龙头股的走势判断-龙头股的两种走势形态-如何避开常见四种陷进

强势龙头股的两种走势形态-一气呵成形态与空中加油形态。 主力操作强势龙头股的两种惯用手法,强势股短期内股价涨幅较大,如果按强势龙头股走势表现划分的话,可以将其划分为一气呵成式和空中加油式两种。 上图强势龙头股的两种拉升走势。 一…

Vue Promise的使用,界面使用异步线程循环执行方法(模拟线程)

目录 1.定义开始和退出标识 2.定义开始方法--异步 3.定义循环方法,以及控制规则 4.定义业务方法 1.定义开始和退出标识 为的是能控制开始和结束,记得销毁时要结束循环,否则方法会一直被执行 data() {return {isrunning: false, // 轮询…

16 —— Webpack多页面打包

需求&#xff1a;把 黑马头条登陆页面-内容页面 一起引入打包使用 步骤&#xff1a; 准备源码&#xff08;html、css、js&#xff09;放入相应位置&#xff0c;并改用模块化语法导出 原始content.html代码 <!DOCTYPE html> <html lang"en"><head&…

SAP开发语言ABAP开发入门

1. 了解ABAP开发环境和基础知识 - ABAP简介 - ABAP&#xff08;Advanced Business Application Programming&#xff09;是SAP系统中的编程语言&#xff0c;主要用于开发企业级的业务应用程序&#xff0c;如财务、物流、人力资源等模块的定制开发。 - 开发环境搭建 - 首先需…

unity 使用UI上的数字按钮,给text添加数字,并且显示光标,删除光标前数字,

今天有个需求&#xff0c;输入身份证&#xff0c;但是不用键盘&#xff0c;要点击按钮输入数字&#xff0c;并且可以控制光标&#xff0c; 1、数字按钮&#xff1a;点击后text添加数字内容 2、删除按钮&#xff1a;删除光标前的一个字符 3、左箭头&#xff1a;移动光标向左移动…

医学机器学习:数据预处理、超参数调优与模型比较的实用分析

摘要 本文介绍了医学中的机器学习&#xff0c;重点阐述了数据预处理、超参数调优和模型比较的技术。在数据预处理方面&#xff0c;包括数据收集与整理、处理缺失值、特征工程等内容&#xff0c;以确保数据质量和可用性。超参数调优对模型性能至关重要&#xff0c;介绍了多种调…

TCMC-PMSA; p-SCN-Bn-TCMC; TCMC-PSMA-617

p-SCN-Bn-TCMC拥有双功能配体的特性&#xff0c;既是螯合剂&#xff0c;也具备共价连接到生物靶向载体&#xff08;如抗体、肽和蛋白质&#xff09;的反应位点。该化合物的分子式为C24H37N9O4S4HCl&#xff0c;分子量达到693.5&#xff0c;纯度通常保持在95%以上。p-SCN-Bn-TCM…

缓存使用规范学习

1.规范 size控制: string类型&#xff0c;控制在2KB以内 hash、list、set、zset类型的元素个数&#xff0c;不要超过5000 pipeline命令: 检查多参数命令的参数个数或pipeline命令个数&#xff0c;若值太大&#xff0c;建议减小&#xff08;codis proxy返回结果集超64K&…