`
student_lp
  • 浏览: 437991 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

    mysql的query cache用来缓存和query有关的数据。具体来说Query cache有其特殊的业务场景,它不像其他的数据库产品,缓存查询语句的执行计划等信息;而query cache则是缓存客户端提交给mysql的select语句以及语句的结果集,就是将select语句和语句的结果做hash映射关系后保存在一定的内存区域内。

一、工作原理

     查询缓存的工作原理,基本上可以通过两句话概括:

  • 缓存select操作或预处理查询(5.1.17开始支持)的结果集SQL语句
  • 新的select语句或预处理查询语句,先去查询缓存,判断是否存在可用的结果集,判断标准:与缓存的SQL语句是否完全一致,区分大小写;

二、查询缓存对什么样的查询语句,无法缓存其结果集

  • 查询语句中添加了SQL_NO_CACHE参数;
  • 查询语句中包含有获得值的函数,以及自定义函数,如:curdate(),get_lock(),rand(),convert_tz等;
  • 对系统数据库的查询:mysql、information_schema库查询;
  • 查询语句中使用SESSION级别变量或存储过程中的局部变量;
  • 查询语句中使用了lock in share mode、for update语句;
  • 查询语句中类似select ... into ... 导出数据语句;
  • 事务隔离级别为:Serializable情况下,所有查询语句都不能缓存;
  • 对临时表的查询操作;
  • 存在警告信息的查询语句;
  • 不涉及任何表或视图的查询语句;
  • 某用户只有列级别权限的查询语句;

三、配置

    是否启用mysql查询缓存,可以通过2个参数:query_cache_type和query_cache_size,其中任何一个参数设置为0都意味着关闭查询缓存功能。如果需要关闭查询缓存,正确的设置推荐为query_cache_type=0。

  • query_cache_type:0-不启用查询缓存;1-启用查询缓存,只要符合缓存的要求就会缓存,供其他客户端使用;2-启用查询缓存,只要查询语句中添加了参数-SQL_CACHE,且符合查询缓存的要求,客户端的查询语句和记录集就可以缓存起来,供其他客户端使用;
  • query_cache_size:允许设置query_cache_size的值最小为40k,对于最大值则可以几乎认为无限制。实际生产环境的应用经验告诉我们,该值并不是越大越好,应该合理设置,推荐设置为64M。
  • query_cache_limit:限制查询缓存区最大能缓存的查询记录集,可以避免一个大的查询记录结果集占去大量的内存区域,而且往往小查询记录集是最有效的缓存记录集,默认设置为1M,建议修改为16k~1024K之间的值。
  • query_cache_min_res_unit:设置查询缓存分配内存的最小单位,要适当的设置该参数,可以做到为减少内存块的申请和分配次数,但是设置过大可能会导致内存碎片数的上升。默认为4K,建议设置大小为1k~16k。
  • query_cache_wlock_invalidate:该参数主要涉及MyISAM引擎,若一个客户端对某表添加了写锁,其他客户端发起的查询请求,且查询语句有对应的查询缓存记录,是否允许直接读取查询缓存的记录集信息,还是等待写锁的释放。默认为0即允许;

四、维护

  • 查询缓存区的碎片整理:查询缓存使用一段时间后,一般都会出现缓存碎片,为此需要监控相关的状态值,并定期进行内存碎片的整理,碎片整理的操作语句为:FLUSH QUERY CACHE。
  • 清空查询缓存的数据:那些操作可能触发查询缓存,把所有缓存信息清空,以避免触发或需要的时候,知道如何做。两类可触发查询缓存数据全部清空的命令:reset query cache;flush tables;

五、性能监控

    1、mysql提供一系列Global Status记录Query Cache当前状态,具体如下:

  •  Qcache_free_blocks:目前处于空闲状态的Query Cache中内存block数目;
  • Qcache_free_memory:目前处于空闲状态的Query Cache内存总量;
  • Qcache_hits:query cache 命中次数;
  • Qcache_inserts:向Query Cache中插入新的Query Cache次数,也就是没有命中的次数。
  • Qcache_lowmem_prunes:当Query Cache内存容量不够,需要从删除旧的Query Cache以给新Cache对象使用的次数;
  • Qcache_not_cached:没有被Cache的SQL数,包括无法被Cache的SQL以及由于Query_cache_type设置而不会被cache的SQL。
  • Qcache_queries_in_cache:目前在Query cache中的SQL数量;
  • Qcache_total_blocks:Query cache中总的block数量。

    2、重要监控率的计算:

  • 查询缓存内存碎片率=Qcache_free_blocks / Qcache_total_blocks * 100%;
  • 查询缓存命中率=Qcache_hits / (Qcache_hits + Qcache_inserts) * 100%;
  • 查询缓存内存使用率=(query_cache_size - Qcache_free_memory) / query_cache_size * 100%;

    若整个平稳运行期监控率获得的信息为:命中率高于80%,内存使用率超过80%,并且Qcache_lowmem_prunes的值不停的增加,而且增加的数据还比较大,则说明我们为查询缓存缓冲区分配的内存过小,可以适当的增加查询缓冲区的大小;

    若整个平稳运行期监控获得的信息为:命中率低于40%,Qcache_lowmem_prunes的值也保持一个平稳的状态,则说明我们的查询缓冲区的设置过大,或者说业务场景重复执行一样查询语句的概率低,同时若还检测到一定量的freeing items,那么必须考虑把查询缓存的内存调小,甚至关闭查询缓存功能。

六、查询缓存的更新策略

    query cache一旦达到上限后,就会剔除老的query cache对象。同时,为了保证query cache中的内容与实际数据绝对一致,当表中的数据有任何变化,包括新增、修改、删除等,都会使所有应用到该表的SQL的query cache失效。

七、查询缓存的优缺点

  • 不需要对SQL语句做任何解析和执行,当然语法解析必须通过先,直接从query cache中获取查询结果;
  • 查询缓存的判断规则不够智能,也提高了查询缓存的使用门槛,降低其效率;
  • query cache的启用,会增加检查和清理query cache中记录集的开销,而且存在SQL语句缓存的表,每一张都只有一个对应的全局锁。

八、查询缓存的使用业务

  • 整个系统以读为主的业务,比如门户型、新闻类、报表型、论坛等网站;
  • 查询语句操作的表对象,非频繁的进行DML操作,可以使用query_cache_type=2模式,然后SQL语句加SQL_CACHE参数指定。
分享到:
评论

相关推荐

    MysqL缓存的解决方案

    "MySQL缓存的解决方案" MySQL 缓存是提高数据库性能的一种重要手段,它可以减少数据库的读写次数,从而提高系统的整体性能。以下将对 MySQL 缓存的解决方案进行详细的介绍。 缓存的必要性 缓存的主要目的是减少...

    mysql查询缓存

    MySQL的查询缓存并非缓存执行计划,而是查询及其结果集,这就意味着只有相同的查询操作才能命中缓存,因此MySQL的查询缓存命中率很低,另一方面,对于大结果集的查询,其查询结果可以从cache中直接读取,有效的提升...

    MySQL缓存研究

    通过对MySQL缓存的深入研究,我们可以理解缓存在数据库性能中的关键作用,学习如何调整和优化缓存以适应不断变化的业务需求,从而提升系统的整体性能和响应时间。这不仅可以减轻数据库服务器的压力,还能为用户提供...

    mysql缓存查询和设置

    mysql缓存查询和设置global_query_cache_size

    释放查询潜力:深度配置MySQL查询缓存

    ### 释放查询潜力:深度配置 MySQL 查询缓存 #### MySQL 概览 MySQL 是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于 Web 应用程序的后端数据存储。它基于结构化查询语言(SQL)进行数据管理,是 LAMP...

    MysqlHelper.cs带注释带缓存带MySql.Data.dll

    - 缓存机制:`MysqlHelper`可能会包含一个缓存层,如使用`System.Runtime.Caching`命名空间中的`MemoryCache`类,来存储频繁查询的结果,减少对数据库的访问,提高性能。 - 缓存策略:缓存的添加、过期和清理策略...

    Mysql 缓存

    MySQL数据库系统在处理查询时,为了提高性能,使用了多种缓存机制,其中最常见的是查询缓存(Query Cache)。本文将深入探讨MySQL的查询缓存功能,以及如何通过全局变量`global_query_cache_size`来调整其大小。 ...

    mysql8的配置文件,包含端口 缓存配置

    mysql8的安装配置文件 包含端口 缓存 用户名密码的配置

    Linux下使用C++编写的并发服务器,redis缓存和MySQL数据库,GoogleTest单元测试和webbench压力测试

    spark一个Linux下使用C++学习编写的并发服务器,使用redis作为缓存和MySQL作为数据库,并利用GoogleTest编写单元测试和webbench进行压力测试。.zipspark一个Linux下使用C++学习编写的并发服务器,使用redis作为缓存...

    mysql缓存优化

    ### MySQL缓存优化详解 #### 一、MySQL存储引擎概览与选择 ##### 1.1 存储引擎类型 MySQL 提供了多种存储引擎,每种引擎都有其独特的优势和适用场景。以下是最常见的几种存储引擎: - **MyISAM**:MySQL 的默认...

    提高MySql查询性能 - 打开和设置查询缓存 视频教程

    提高MySql查询性能 - 打开和设置查询缓存 视频教程 京华志&精华志出品 希望大家互相学习,互相进步 支持CSDN 支持微软 主要包括C# ASP.NET SQLDBA 源码 毕业设计 开题报告 答辩PPT等等好多知识

    MySQL优化之缓存优化(续)

    MySQL缓存优化是数据库性能提升的关键一环,尤其在高并发和大数据量的场景下,合理利用缓存能显著减少磁盘I/O操作,提高查询速度。本文将深入探讨MySQL中的各种缓存机制及其优化策略。 首先,我们关注的是查询缓存...

    Mysql查询流程分析

    如果之后有相同的查询再次执行,MySQL可以直接从缓存中获取结果而无需重新执行查询,从而大大提高了查询速度。然而,需要注意的是,查询缓存的使用可能会受到某些因素的影响,例如缓存空间大小限制以及缓存失效策略...

    MySQL 执行过程与查询缓存1

    MySQL 执行过程与查询缓存是数据库操作中的关键环节,理解这一过程对于优化数据库性能至关重要。MySQL 的执行流程包括以下几个步骤: 1. **客户端发送查询**:当用户通过MySQL客户端发送一条SQL查询时,这个请求会...

    清空mysql 查询缓存的可行方法

    在MySQL数据库系统中,查询缓存是一个非常重要的性能优化机制,它允许服务器存储先前执行的SQL查询及其结果,以便在后续请求相同查询时快速返回结果,而无需再次解析和执行查询。然而,这也可能导致某些情况下优化...

    C/C++实现mysql数据库的缓存管理

    C/C++实现mysql数据库的缓存管理 Linux下用C/C++写一个提高mysql数据库效率的数据缓存模块 缓存管理 window下用C/C++写一个提高mysql数据库效率的数据缓存模块 C/C++ mysql缓存 缓存 PS:记得要先把数据库给搭建起来

    PHP查询缓存.doc

    【PHP查询缓存】是指在PHP应用程序中,为了提高数据库查询效率和减轻数据库负载,将SQL查询的结果存储起来,下次相同查询时直接读取缓存数据,而不是重新执行查询。这种方式特别适用于那些频繁且静态的数据,可以...

    mysql高级优化查询

    根据提供的文件信息,我们可以深入探讨 MySQL 的高级优化查询这一主题,包括其查询缓存原理以及 MySQL 的内部机制等核心知识点。 ### 一、MySQL 查询缓存原理 #### 1.1 什么是查询缓存 查询缓存是 MySQL 中用于...

    redis做mysql缓存服务器(公司内部培训资料)

    ### Redis作为MySQL缓存服务器(公司内部培训资料) #### 一、Redis简介 Redis是一种开源的键值存储系统,主要用于高速缓存数据。与Memcached相比,虽然两者都基于内存进行数据存储以确保高效率,但Redis具备更...

Global site tag (gtag.js) - Google Analytics