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

什么是MySQL查询缓存

2024-04-02 19:04:59 250人浏览 薄情痞子
摘要

本篇内容主要讲解“什么是Mysql查询缓存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是mysql查询缓存”吧!QueryCache介绍Mysql查询缓(

本篇内容主要讲解“什么是Mysql查询缓存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是mysql查询缓存”吧!

QueryCache介绍

Mysql查询缓(QC:QueryCache)在MySQL  4.0.1中引入,查询缓存存储SELECT语句的文本以及发送给客户机的结果集,如果再次执行相同的SQL,Server端将从查询缓存中检索结果返回给客户端,而不是再次解析执行SQL,查询缓存在session之间共享,因此,一个客户端生成的缓存结果集,可以响应另一个客户端执行同样的SQL。

什么是MySQL查询缓存

回到开头的问题,如何判断SQL是否共享?

通过SQL文本是否完全一致来判断,包括大小写,空格等所有字符完全一模一样才可以共享,共享好处是可以避免硬解析,直接从QC获取结果返回给客户端,下面的两个SQL是不共享滴,因为一个是from,另一个是From。

--SQL 1 select id, balance from account where id = 121; --SQL 2 select id, balance From account where id = 121;

下面是oracle数据库通过SQL_TEXT生成sql_id的算法,如果sql_id不一样说明就不是同一个SQL,就不共享,就会发生硬解析。

#!/usr/bin/perl -w use Digest::MD5  qw(md5 md5_hex md5_base64); use Math::BigInt; my $stmt = "select id, balance from account where id = 121\0";  my $hash = md5 $stmt;  my($a,$b,$msb,$lsb) = unpack("V*",$hash); my $sqln = $msb*(2**32)+$lsb; my $stop = log($sqln) / log(32) + 1; my $sqlid = ''; my $charbase32 = '0123456789abcdfghjkmnpqrstuvwxyz'; my @chars = split '', $charbase32; for($i=0; $i < $stop-1; $i++){   my $x = Math::BigInt->new($sqln);   my $seq = $x->bdiv(32**$i)->bmod(32);   $sqlid = $chars[$seq].$sqlid; } print "SQL is:\n    $stmt \nSQL_ID is\n    $sqlid\n";

大家可以发现SQL 1和SQL 2通过代码生成的sql_id值是不一样,所以不共享。

SQL is:    select id, balance from account where id = 121  SQL_ID is  dm5c6ck1g7bds SQL is:    select id, balance From account where id = 121  SQL_ID is  6xb8gvs5cmc9b

如果让你比较两个Java代码文件的内容的有何差异,只需要将这段代码理解透了,就可以改造实现自己的业务逻辑。

QueryCache配置

mysql> show variables like '%query_cache%'; +------------------------------+----------+ | Variable_name                | Value    | +------------------------------+----------+ | have_query_cache             | YES      | | query_cache_limit            | 1048576  | | query_cache_min_res_unit     | 4096     | | query_cache_size             | 16777216 | | query_cache_type             | OFF      | | query_cache_wlock_invalidate | OFF      |

 什么是MySQL查询缓存

query_cache_min_res_unit说明

默认大小是4KB,如果有很多查询结果很小,那么默认数据块大小可能会导致内存碎片,由于内存不足,碎片可能会强制查询缓存从缓存中删除查询。

在这种情况下,可以减小query_cache_min_res_unit的值,由于修剪而删除的空闲块和查询的数量由Qcache_free_blocks和Qcache_lowmem_prunes状态变量的值给出,如果大量的查询有较大的结果集,可以增大该参数的值来提高性能。

通常开启QueryCache方式

# 修改MySQL配置文件/etc/my.cnf,添加如下配置,重启MySQL server即可。 [mysqld] query_cache_size = 32M query_cache_type = 1

QueryCache使用

先搞点测试数据,分别对禁用和开启QueryCache下的场景进行测试。

--创建一个用户表users,并且插入100w数据。 CREATE TABLE `users` (   `id` bigint NOT NULL AUTO_INCREMENT,   `name` varchar(20) NOT NULL DEFAULT '' COMMENT '姓名',   `age` tinyint NOT NULL DEFAULT '0' COMMENT 'age',   `gender` char(1) NOT NULL DEFAULT 'M' COMMENT '性别',   `phone` varchar(16) NOT NULL DEFAULT '' COMMENT '手机号',   `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',   `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';  select count(*) from users; +----------+ | count(*) | +----------+ |  1000000 |

禁用queryCache场景

在不使用QueryCache的时候,每次执行相同的查询语句,都要发生一次硬解析,消耗大量的资源。

什么是MySQL查询缓存
#禁用QueryCache的配置 query_cache_size = 0 query_cache_type = 0

重复执行下面查询,观察执行时间。

--第一次执行查询语句 mysql> select * from users order by create_time desc limit 10; +---------+------------+-----+--------+-------------+---------------------+---------------------+ | id      | name       | age | gender | phone       | create_time         | update_time         | +---------+------------+-----+--------+-------------+---------------------+---------------------+ |  997855 | User997854 |  54 | M      | 15240540354 | 2020-12-15 14:34:50 | 2020-12-15 14:34:50 | ....... 10 rows in set (0.89 sec) --第二次执行同样的查询语句 mysql> select * from users order by create_time desc limit 10; +---------+------------+-----+--------+-------------+---------------------+---------------------+ | id      | name       | age | gender | phone       | create_time         | update_time         | +---------+------------+-----+--------+-------------+---------------------+---------------------+ |  997855 | User997854 |  54 | M      | 15240540354 | 2020-12-15 14:34:50 | 2020-12-15 14:34:50 | ....... 10 rows in set (0.90 sec) -- profile跟踪情况 mysql> show profile cpu,block io for query 1;   +----------------------+----------+----------+------------+--------------+---------------+ | Status               | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | +----------------------+----------+----------+------------+--------------+---------------+ | preparing            | 0.000022 | 0.000017 |   0.000004 |            0 |             0 | | Sorting result       | 0.000014 | 0.000009 |   0.000005 |            0 |             0 | | executing            | 0.000011 | 0.000007 |   0.000004 |            0 |             0 | | Sending data         | 0.000021 | 0.000016 |   0.000004 |            0 |             0 | | Creating sort index  | 0.906290 | 0.826584 |   0.000000 |            0 |             0 |

可以看到,多次执行同样的SQL查询语句,执行时间都是0.89s左右,几乎没有差别,同时时间主要消耗在Creating sort index阶段。

开启queryCache场景

开启查询缓存时,查询语句第一次被执行时会将SQL文本及查询结果缓存在QC中,下一次执行同样的SQL执行从QC中获取数据返回给客户端即可。

什么是MySQL查询缓存
  1. #禁用QueryCache的配置 

  2. query_cache_size = 32M 

  3. query_cache_type = 1 


--第一次执行查询语句 mysql> select * from users order by create_time desc limit 10; +---------+------------+-----+--------+-------------+---------------------+---------------------+ | id      | name       | age | gender | phone       | create_time         | update_time         | +---------+------------+-----+--------+-------------+---------------------+---------------------+ |  997855 | User997854 |  54 | M      | 15240540354 | 2020-12-15 14:34:50 | 2020-12-15 14:34:50 | ....... 10 rows in set (0.89 sec) --第二次执行查询语句 mysql> select * from users order by create_time desc limit 10; +---------+------------+-----+--------+-------------+---------------------+---------------------+ | id      | name       | age | gender | phone       | create_time         | update_time         | +---------+------------+-----+--------+-------------+---------------------+---------------------+ |  997855 | User997854 |  54 | M      | 15240540354 | 2020-12-15 14:34:50 | 2020-12-15 14:34:50 | ....... 10 rows in set (0.00 sec) -- profile跟踪数据 mysql> show profile cpu,block io for query 3; +--------------------------------+----------+----------+------------+--------------+---------------+ | Status                         | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | +--------------------------------+----------+----------+------------+--------------+---------------+ | Waiting for query cache lock   | 0.000016 | 0.000015 |   0.000001 |            0 |             0 | | checking query cache for query | 0.000007 | 0.000007 |   0.000000 |            0 |             0 | | checking privileges on cached  | 0.000004 | 0.000003 |   0.000000 |            0 |             0 | | checking permissions           | 0.000034 | 0.000033 |   0.000001 |            0 |             0 | | sending cached result to clien | 0.000018 | 0.000017 |   0.000001 |            0 |             0 |

可以看到,第一次执行QueryCache里没有缓存SQL文本及数据,执行时间0.89s,由于开启了QC,SQL文本及执行结果被缓存在QC中,第二次执行执行同样的SQL查询语句,直接命中QC且返回数据,不需要发生硬解析,所以执行时间降低为0s,从profile里看到sending  cached result to client直接发送QC中的数据返回给客户端。

查询缓存命中率

查询缓存相关的status变量

mysql>SHOW GLOBAL STATUS LIKE 'QCache\_%'; +-------------------------+----------+ | Variable_name           | Value    | +-------------------------+----------+ | Qcache_free_blocks      | 1        |  --查询缓存中可用内存块的数目。 | Qcache_free_memory      | 33268592 |  --查询缓存的可用内存量。 | Qcache_hits             | 121      |  --从QC中获取结果集的次数。 | Qcache_inserts          | 91       |  --将查询结果集添加到QC的次数,意味着查询已经不在QC中。 | Qcache_lowmem_prunes    | 0        |  --由于内存不足而从查询缓存中删除的查询数。 | Qcache_not_cached       | 0        |  --未缓存的查询数目。 | Qcache_queries_in_cache | 106      |  --在查询缓存中注册的查询数。 | Qcache_total_blocks     | 256      |  --查询缓存中的块总数。

查询缓存命中率及平均大小

                                          Qcache_hits Query cache hit rate = ------------------------------------------------ x 100%                        Qcache_hits + Qcache_inserts + Qcache_not_cached                                                       query_cache_size = Qcache_free_memory Query Cache Avg Query Size = ---------------------------------------                                       Qcache_queries_in_cache

更新操作对QC影响

举个例子,支付系统的里转账逻辑,先要定账户再修改余额,主要步骤如下:

 什么是MySQL查询缓存

什么是MySQL查询缓存

对于这种情况来说,QC是不太适合的,因为第一次执行查询SQL未命中,返回结果给客户端,添加SQL文本及结果集到QC之后,下一次执行同样的SQL直接从QC返回结果,不需要硬解析操作,但是每次Update都是先更新数据,然后锁定QC然后更新缓存结果,会导致之前的缓存结果失效,再次执行相的查询SQL还是未命中,有得重新添加到QC,这样频繁的锁定QC->检查QC->添加QC->更新QC非常消耗资源,降低数据库并发处理能力。

为何放弃QueryCache

一般业务场景

从业务系统的操作类型,可以分为OLTP(OnLine Transaction Processing 联机事务处理系统)和OLAP(OnLine  Analysis Processing联机分析处理系统),对于政企业务,也可以分为BOSS(Business Operation Support  System-业务操作支撑系统,简称业支)和BASS(Business Analysis Support  System-业务分析支撑系统,简称经分),来总结下这两类系统的特点。

什么是MySQL查询缓存

适合QueryCache的场景

首先,查询缓存QC的大小只有几MB,不适合将缓存设置得太大,由于在更新过程中需要线程锁定QueryCache,因此对于非常大的缓存,可能会看到锁争用问题。那么,哪些情况有助于从查询缓存中获益呢?以下是理想条件:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 相同的查询是由相同或多个客户机重复发出的。

  3. 被访问的底层数据本质上是静态或半静态的。

  4. 查询有可能是资源密集型和/或构建简短但计算复杂的结果集,同时结果集比较小。

  5. 并发性和查询QPS都不高。

这4种情况只是理想情况下,实际的业务系统都是有CRUD操作的,数据更新比较频繁,查询接口的QPS比较高,所以能满足上面的理想情况下的业务场景实在很少,我能想到就是配置表,数据字典表这些基本都是静态或半静态的,可以时通过QC来提高查询效率。

不适合QueryCache的场景

如果表数据变化很快,则查询缓存将失效,并且由于不断从缓存中删除查询,从而使服务器负载升高,处理速度变得更慢,如果数据每隔几秒钟更新一次或更加频繁,则查询缓存不太可能合适。

同时,查询缓存使用单个互斥体来控制对缓存的访问,实际上是给服务器SQL处理引擎强加了一个单线程网关,在查询QPS比较高的情况下,可能成为一个性能瓶颈,会严重降低查询的处理速度。因此,MySQL  5.6中默认禁用了查询缓存。

删除QueryCache

The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL  8.0. Deprecation includes query_cache_type,可以看到从MySQL  5.6的默认禁用,5.7的废弃以及8.0的彻底删除,Oracle也是综合了各方面考虑做出了这样的选择。

上面聊了下适合和不适合的QueryCache的业务场景,发现这个特性对业务场景要求过于苛刻,与实际业务很难吻合,而且开启之后,对数据库并发度和处理能力都会降低很多,下面总结下为何MySQL从Disabled->Deprecated->Removed  QueryCache的主要原因。

什么是MySQL查询缓存

同时查询缓存碎片化还会导致服务器的负载升高,影响数据库的稳定性,在Oracle官方搜索QueryCache可以发现,有很多Bug存在,这也就决定了MySQL  8.0直接果断的Remove了该特性。

到此,相信大家对“什么是MySQL查询缓存”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: 什么是MySQL查询缓存

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

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

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

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

下载Word文档
猜你喜欢
  • 什么是MySQL查询缓存
    本篇内容主要讲解“什么是MySQL查询缓存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是MySQL查询缓存”吧!QueryCache介绍MySQL查询缓(...
    99+
    2022-10-18
  • mysql中查询缓存的原理是什么
    mysql中查询缓存的原理是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、说明MYSQL的查询缓存本质上是缓存SQL的hash值和该SQL的查询结果,如果运行相同的...
    99+
    2023-06-15
  • mysql怎么查询缓存
    这篇文章给大家分享的是有关mysql怎么查询缓存的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明打开查询缓存后,在相同的查询条件和数据的情况下,在缓存中直接返回结果。这里的查询条件包括查询本身、现在查询的数据库...
    99+
    2023-06-20
  • MySQL的查询缓存机制是什么意思
    本篇内容主要讲解“MySQL的查询缓存机制是什么意思”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL的查询缓存机制是什么意思”吧!  查询必须是完全相同...
    99+
    2022-10-18
  • MySQL之查询缓存
    一、查询缓存的误区刚接触QC时,觉得是个好东西,可以将查询的结果放到QC中,这样极大的提升查询的速度,但是后来了解到如果对表进行做DML或者DDL,QC相对应的缓存就会释放,这样对于频繁更改的数据库是没有任...
    99+
    2022-10-18
  • MySQL中怎么查询缓存
    MySQL中怎么查询缓存,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 可以通过下面的SQL查看当前查...
    99+
    2022-10-18
  • 何为MySQL查询缓存
    本篇内容主要讲解“何为MySQL查询缓存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“何为MySQL查询缓存”吧!我们知道,缓存的设计思想在RDBMS数据库中无...
    99+
    2022-10-18
  • MySQL怎样查询缓存
    小编给大家分享一下MySQL怎样查询缓存,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MySQL Reference Manua...
    99+
    2022-10-18
  • MySQL 查询缓存详解
    文章目录 MySQL 查询缓存介绍MySQL 查询缓存管理和配置MySQL 缓存机制缓存规则缓存机制中的内存管理 MySQL 查询缓存的优缺点优点缺点 MySQL 查询缓存对性能的影响总结 缓存是一个有效且实用的系统性能...
    99+
    2023-08-16
    mysql mysql查询缓存
  • MySQL优化(4):查询缓存
    查询缓存: MySQL提供的数据缓存QueryCache,用于缓存SELECT查询的结果 默认不开启,需要在配置文件中开启缓存(my.ini/my.cnf) 在[mysqld]段中,修改query_cache_type完成...
    99+
    2018-07-13
    MySQL优化(4):查询缓存
  • mysql基础(五)查询缓存
    缓存的有缺点     1、如果命中缓存,直接从缓存中返回,减少分析和执行SQL语句的过程,提高查询效率     2、缓存会带来...
    99+
    2022-10-18
  • MySQL中怎么查询缓存变量
    这篇文章将为大家详细讲解有关MySQL中怎么查询缓存变量,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  MySQL查询缓存变量解释:  Qcache_fr...
    99+
    2022-10-18
  • MySQL的查询缓存和Buffer Pool
    一、Caches - 查询缓存 下图是MySQL官网给出的:MySQL架构体系图。 人们常说的查询缓存就是下图中的Cache部分。 如果将MySQL分成 Server层和存储引擎层两大部分,那么Caches位于Ser...
    99+
    2022-05-22
    MySQL 查询缓存 MySQL buffer pool
  • MySQL查询缓存的小知识
    前言 我们知道,缓存的设计思想在RDBMS数据库中无处不在,就拿号称2500w行代码,bug堆积如山的Oracle数据库来说,SQL的执行计划可以缓存在library cache中避免再次执行相同SQL发生硬解析(...
    99+
    2022-05-17
    mysql 查询缓存 MySQL 查询
  • 如何在mysql中查询缓存
    本篇文章为大家展示了如何在mysql中查询缓存,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、查询缓存的实现流程二、配置查询缓存查看当前的mysql数据库是否支持查询缓存SHOW VAR...
    99+
    2023-06-07
  • MySQL数据库中怎么查询缓存
    这期内容当中小编将会给大家带来有关MySQL数据库中怎么查询缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存条件,原理MySQL Query Cache是用来缓...
    99+
    2022-10-18
  • mysql如何查询缓存未命中
    小编给大家分享一下mysql如何查询缓存未命中,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.缓存未命中概念:任何SELECT语句没有从查询缓存中返回都称为“缓存未命中”,以如下列情况:查询语句无法被缓存,可能因为查询中...
    99+
    2023-06-14
  • mysql的查询缓存及innodb缓存回收机制讲解
    这篇文章主要讲解了“mysql的查询缓存及innodb缓存回收机制讲解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql的查询缓存及innodb缓存回...
    99+
    2022-10-18
  • MySQL之变量、查询缓存和索引
    MySQL中的系统数据库mysql数据库:是mysql的核心数据库,类似于sql server中的master库,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息PERFO...
    99+
    2022-10-18
  • MySQL查询缓存涉及多少参数
    本篇文章给大家分享的是有关MySQL查询缓存涉及多少参数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 查询缓存...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作