广告
返回顶部
首页 > 资讯 > 数据库 >MySQL数据库中怎么查询缓存
  • 517
分享到

MySQL数据库中怎么查询缓存

2024-04-02 19:04:59 517人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关Mysql数据库中怎么查询缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存条件,原理mysql Query Cache是用来缓

这期内容当中小编将会给大家带来有关Mysql数据库中怎么查询缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一、缓存条件,原理

mysql Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,Mysql在实现Query  Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中。当客户端发起SQL查询时,Query  Cache的查找逻辑是,先对SQL进行相应的权限验证,接着就通过Query  Cache来查找结果(注意必须是完全相同,即使多一个空格或者大小写不同都认为不同,即使完全相同的SQL,如果使用不同的字符集、不同的协议等也会被认为是不同的查询而分别进行缓存)。它不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生同任何存储引擎的交互,减少了大量的磁盘io和CPU运  算,所以有时候效率非常高。

查询缓存的工作流程如下:

1:命中条件

缓存存在一个hash表中,通过查询SQL,查询数据库,客户端协议等作为key.在判断是否命中前,MySQL不会解析SQL,而是直接使用SQL去查询缓存,SQL任何字符上的不同,如空格,注释,都会导致缓存不命中.

如果查询中有不确定数据,例如CURRENT_DATE()和NOW()函数,那么查询完毕后则不会被缓存.所以,包含不确定数据的查询是肯定不会找到可用缓存的

2:工作流程

  • 服务器接收SQL,以SQL和一些其他条件为key查找缓存表(额外性能消耗)

  • 如果找到了缓存,则直接返回缓存(性能提升)

  • 如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等.

  • 执行完SQL查询结果以后,将SQL查询结果存入缓存表(额外性能消耗)

二、相关SQL语句

2.1、查看SQL缓存参数:show variables like '%query_cache%';

MySQL数据库中怎么查询缓存

其中各个参数的意义如下:

  • Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY  CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。

  • Qcache_free_memory:缓存中的空闲内存。

  • Qcache_hits:每次查询在缓存中命中时就增大

  • Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。

  • Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个  数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)

  • Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。

  • Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。

  • Qcache_total_blocks:缓存中块的数量。

2.2、开启SQL缓存:set global query_cache_type = 1;

2.3、关闭SQL缓存:set global query_cache_type = 0;

2.4、设置缓存空间:set global query_cache_size = 1024*1024*64 (64M)

2.5、固定SQL语句声明不适用缓存:select sql_no_cache * from 表名

注意:改变SQL语句的大小写或者数据表有数据改动,则不会调用缓存。

2.6、配置查询缓存

vi /etc/my.cnf  query_cache_size=300M query_cache_type=1
MySQL数据库中怎么查询缓存

三、清除缓存

mysql的FLUSH句法(清除缓存)

FLUSH flush_option [,flush_option]

如果你想要清除一些MySQL使用内部缓存,你应该使用FLUSH命令。为了执行FLUSH,你必须有reload权限。

flush_option可以是下列任何东西:

  • HOSTS 这个用的最多,经常碰见。主要是用来清空主机缓存表。如果你的某些主机改变IP数字,或如果你得到错误消息Host ...  isblocked,你应该清空主机表。当在连接MySQL服务器时,对一台给定的主机有多于  max_connect_errors个错误连续不断地发生,MySQL为了安全的需要将会阻止该主机进一步的连接请求。清空主机表允许主机再尝试连接。

  • LOGS 关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。

  • PRIVILEGES  这个也是经常使用的,每当重新赋权后,为了以防万一,让新权限立即生效,一般都执行一把,目地是从数据库授权表中重新装载权限到缓存中。

  • TABLES 关闭所有打开的表,同时该操作将会清空查询缓存中的内容。

  • FLUSH TABLES WITH READ LOCK 关闭所有打开的表,同时对于所有数据库中的表都加一个读,直到显示地执行unlock  tables,该操作常常用于数据备份的时候。

  • STATUS 重置大多数状态变量到0。

  • MASTER  删除所有的二进制日志索引文件中的二进制日志文件,重置二进制日志文件的索引文件为空,创建一个新的二进制日志文件,不过这个已经不推荐使用,改成reset  master 了。可以想象,以前自己是多土啊,本来一条简单的命令就可以搞定的,却要好几条命令来,以前的做法是先查出来当前的二进制日志文件名,再用purge  操作。

  • QUERY CACHE 重整查询缓存,消除其中的碎片,提高性能,但是并不影响查询缓存中现有的数据,这点和Flush table 和Reset Query  Cache(将会清空查询缓存的内容)不一样的。

  • SLAVE 类似于重置复制吧,让从数据库忘记主数据库的复制位置,同时也会删除已经下载下来的relay  log,与Master一样,已经不推荐使用,改成Reset Slave了。这个也很有用的。

一般来讲,Flush操作都会记录在二进制日志文件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES  WITH READ  LOCK不会记录,因此上述操作如果记录在二进制日志文件中话,会对从数据库造成影响。注意:Reset操作其实扮演的是一个Flush操作的增强版的角色。

四、缓存的内存管理

缓存会在内存中开辟一块内存(query_cache_size)来维护缓存数据,其中有大概40K的空间是用来维护缓存的元数据的,例如空间内存,数据表和查询结果的映射,SQL和查询结果的映射等.

MySQL将这个大内存块分为小的内存块(query_cache_min_res_unit),每个小块中存储自身的类型,大小和查询结果数据,还有指向前后内存块的指针.

MySQL需要设置单个小存储块的大小,在SQL查询开始(还未得到结果)时就去申请一块空间,所以即使你的缓存数据没有达到这个大小,也需要用这  个大小的数据块去存(这点跟linux文件系统的Block一样).如果结果超出这个内存块的大小,则需要再去申请一个内存块.当查询完成发现申请的内存  块有富余,则会将富余的空间释放掉,这就会造成内存碎片问题,见下图

MySQL数据库中怎么查询缓存

查询缓存存储查询结果后剩余的查询碎片

此处查询1和查询2之间的空白部分就是内存碎片,这部分空闲内存是有查询1查询完以后释放的,假设这个空间大小小于MySQL设定的内存块大小,则无法再被使用,造成碎片问题

在查询开始时申请分配内存Block需要锁住整个空闲内存区,所以分配内存块是非常消耗资源的.注意这里所说的分配内存是在MySQL初始化时就开辟的那块内存上分配的.

五、缓存的使用时机 & 性能

衡量打开缓存是否对系统有性能提升是一个很难的话题

1. 通过缓存命中率判断, 缓存命中率 = 缓存命中次数 (Qcache_hits) / 查询次数 (Com_select)

2. 通过缓存写入率, 写入率 = 缓存写入次数 (Qcache_inserts) / 查询次数 (Qcache_inserts)

3. 通过命中-写入率 判断, 比率 = 命中次数 (Qcache_hits) / 写入次数 (Qcache_inserts),  高性能MySQL中称之为比较能反映性能提升的指数,一般来说达到3:1则算是查询缓存有效,而最好能够达到10:1

任何事情过犹不及,尤其对于某些写频繁的系统,开启Query Cache功能可能并不能让系统性能有提升,有时反而会有下降。原因是MySql为了保证Query  Cache缓存的内容和实际数据绝对一致,当某个数据表发生了更新、删除及插入操作,MySql都会强制使所有引用到该表的查询SQL的Query  Cache失效。对于密集写操作,启用查询缓存后很可能造成频繁的缓存失效,间接引发内存激增及CPU飙升,对已经非常忙碌的数据库系统这是一种极大的负担。

六、查询缓存问题分析

MySQL数据库中怎么查询缓存

上述就是小编为大家分享的MySQL数据库中怎么查询缓存了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL数据库中怎么查询缓存

本文链接: https://www.lsjlt.com/news/57596.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL数据库中怎么查询缓存
    这期内容当中小编将会给大家带来有关MySQL数据库中怎么查询缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存条件,原理MySQL Query Cache是用来缓...
    99+
    2022-10-18
  • PHP怎么查询数据库数据缓存
    在Web开发中,查询数据库数据是一个常见的操作。对于频繁发生的查询操作,如果每次都向数据库发出请求,就会导致数据库压力增大,页面响应速度变慢,影响用户体验。为了解决这个问题,可以使用缓存技术,将经常查询的数据缓存在缓存服务器中,减轻数据库的...
    99+
    2023-05-14
  • MySQL中怎么查询缓存
    MySQL中怎么查询缓存,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 可以通过下面的SQL查看当前查...
    99+
    2022-10-18
  • mysql数据库查询缓存原理详解
    这篇文章将为大家详细讲解有关mysql数据库查询缓存原理详解,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql数据库查询缓存原理是:1、缓存SELECT操作...
    99+
    2022-10-18
  • mysql怎么查询缓存
    这篇文章给大家分享的是有关mysql怎么查询缓存的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明打开查询缓存后,在相同的查询条件和数据的情况下,在缓存中直接返回结果。这里的查询条件包括查询本身、现在查询的数据库...
    99+
    2023-06-20
  • Redis缓存中怎么改善数据库查询性能
    这期内容当中小编将会给大家带来有关Redis缓存中怎么改善数据库查询性能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。因为Redis具有在数据存储中快速读写数据的能力,所...
    99+
    2022-10-18
  • MySQL中怎么查询缓存变量
    这篇文章将为大家详细讲解有关MySQL中怎么查询缓存变量,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  MySQL查询缓存变量解释:  Qcache_fr...
    99+
    2022-10-18
  • MySQL怎样查询缓存
    小编给大家分享一下MySQL怎样查询缓存,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MySQL Reference Manua...
    99+
    2022-10-18
  • MySQL数据库查询中怎么实现多表查询
    今天小编给大家分享一下MySQL数据库查询中怎么实现多表查询的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、多表查询多表查...
    99+
    2023-06-29
  • MySQL数据库中如何查询缓冲机制
    MySQL数据库中如何查询缓冲机制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  MySQL数据库怎么查询缓冲机制  通过调节以下几个参数可...
    99+
    2022-10-18
  • 使用Java实现先查询缓存再查询数据库
    目录前言栗子思路分析原理介绍代码实现项目代码配置文件项目结构SpringBootQueryApplication.javaGoods.javaCacheSelector.j...
    99+
    2022-11-13
  • 什么是MySQL查询缓存
    本篇内容主要讲解“什么是MySQL查询缓存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是MySQL查询缓存”吧!QueryCache介绍MySQL查询缓(...
    99+
    2022-10-18
  • MySQL怎么查询数据库信息
    这篇文章主要讲解了“MySQL怎么查询数据库信息”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL怎么查询数据库信息”吧!查询数据库信息mysqlsh...
    99+
    2022-10-18
  • mysql怎么查询数据库中的表名
    本篇内容介绍了“mysql怎么查询数据库中的表名”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!查询数据库中...
    99+
    2023-01-30
    mysql 数据库
  • mysql怎么查询表中的数据库名
    mysql查询表中的数据库名的语法:“show databases”;mysql查询表中的数据库名的方法:查询所有数据库,sql语句为:“show databases;”查询指定数据库中所有表名,sql语句为:select&nbs...
    99+
    2022-10-23
  • 如何在mysql中查询缓存
    本篇文章为大家展示了如何在mysql中查询缓存,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、查询缓存的实现流程二、配置查询缓存查看当前的mysql数据库是否支持查询缓存SHOW VAR...
    99+
    2023-06-07
  • MySQL数据库之怎么联合查询
    这篇文章主要介绍了MySQL数据库之怎么联合查询的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL数据库之怎么联合查询文章都会有所收获,下面我们一起来看看吧。前言:将多个查询结果的结果集合并到一起(纵向合...
    99+
    2023-06-30
  • 怎么在MySql数据库中实现子查询
    这篇文章给大家介绍怎么在MySql数据库中实现子查询,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。MySql数据库中的子查询:子查询:在一条select查询语句中嵌套另一条s...
    99+
    2022-10-18
  • MySQL数据库中怎么优化索引查询
    这篇文章给大家介绍MySQL数据库中怎么优化索引查询,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。问题描述:我们要访问的表是一个非常大的表,四千万条记录,id是主键,program_i...
    99+
    2022-10-18
  • 怎么在ssm项目中使用redis缓存查询数据
    怎么在ssm项目中使用redis缓存查询数据?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。xml配置:<bean id=&qu...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作