详解MySQL查询缓存

  查询缓存是指存储使用SELECT语法查询到的返回到客户端的文本。当相同的请求再次发生时,会从查询缓存中获取数据,而非再执行一遍查询。查询缓存是共享Session会话的,所以一个客户端的请求可能与另一个客户端的请求得到相同的结果。

  当服务器频繁收到相同的请求而数据库中的表数据变化频率又不高,查询缓存是非常有用的,它可以大大提高应用程序的访问效率。很多Web服务器利用这一原理基于数据库的内容动态生成页面。

  查询缓存并不会返回过期的数据,当数据库中的表数据发生变化时,相关的查询缓存会自动清除。但是查询缓存并不会在多个mysqld服务器实例中更新同一个表的数据时有效。

  查询缓存对于存储在多个数据库分区表中的数据是无效的。如果查询涉及多个数据库分区表,查询缓存会自动失效。

  如果要禁用查询缓存的话,只需在启动时将query_cache_size的大小设置为0即可。

  查询缓存在一定情况下会提升系统的性能,但并不代表在任何情况下都会提升系统的性能,某些情况下,甚至可能会降低系统的性能。如

  1)人们对于分级设置查询缓存的分歧很大,有些人认为可能超出了启用它的好处。查询缓存的大小设置为几十兆的时候通常是有效的,但是设置成几百兆的时候就不一定了。

  2)在服务器超负荷时使用查询缓存是非常有效的。一个由多个SELECT组合成的复杂查询使用查询缓存的效率肯定是非常高效的,但如果有频繁插入数据的话,不使用缓存的话比起使用查询缓存效率要高的多。

  查询缓存的执行原理


  对于下面这两种查询,查询缓存会当作两种不同形式的查询,因为查询缓存会严格比较两次查询的字节是否完全相同。对于不同的字符串,不同的数据表,不同的协议版本,不同的字符集都会当作不同的查询。

SELECT * FROM tbl_name
Select * from tbl_name

  在以下情况下并不适合使用查询缓存

  1)查询是外部查询的一个子查询

  2)在存储过程,触发器或函数中执行的查询

  如果数据表发生变化,如增加/修改/删除表结构或表数据,都会导致查询缓存失效,缓存的数据会自动从缓存中清除。

  当查询缓存包含了以下函数时,查询缓存并不会有效。

  查询缓存不适用的情况

  1)查询使用用户自定义的函数或存储过程。

  2)查询包含了用户变量或本地存储的程序变量。

  3)涉及到数据库中的mysql,INFORMATION_SCHEMA和performance——schema表。

  4)查询涉及到数据库分区表。

  5)查询是如下的类型:

SELECT ... LOCK IN SHARE MODE
SELECT ... FOR UPDATE
SELECT ... INTO OUTFILE ...
SELECT ... INTO DUMPFILE ...
SELECT * FROM ... WHERE autoincrement_col IS NULL

  6)查询用到了临时表。

  7)查询没有用到数据表。

  8)查询包含了警告。

  9)用户查询的表中拥有特定的权限。

  使用查询缓存和不使用查询缓存的两种方式

SELECT SQL_CACHE id, name FROM customer;
SELECT SQL_NO_CACHE id, name FROM customer;

  配置查询缓存


  当查询缓存query_cache_size设置为一个非0的数值时,最小的容量是40KB,这是由它的系统结构所决定的。在应用时设置为多大合适,还是要根据实际情况而定。

时间: 2024-08-04 09:36:34

详解MySQL查询缓存的相关文章

MySQL慢查询(二) - pt-query-digest详解慢查询日志 pt-query-digest 慢日志分析

随笔 - 66 文章 - 0 评论 - 19 MySQL慢查询(二) - pt-query-digest详解慢查询日志 一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的MySQL协议数据来进行分析.可以把分析结果输出到文件中,分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间.次数.占比等

Mysql常用show命令,show variables like xxx 详解,mysql运行时参数

MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 a. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称. b. show databases; -- 显示mysql中所有数据库的名称. c. show columns from table_n

生产要不要开启MySQL查询缓存

一.前言在当今的各种系统中,缓存是对系统性能优化的重要手段.MySQL Query Cache(MySQL查询缓存)在MySQL Server中是默认打开的,但是网上各种资料以及有经验的DBA都建议生产环境中把MySQL Query Cache关闭.按道理,MySQL Server默认打开,是鼓励用户使用缓存,但是大拿们却建议关闭此功能,并且国内各个云厂商提供的MySQL云服务中默认都是关闭这个功能,这是为什么?他们在使用中遇到了什么坑?本文将会从以下几方面来详解MySQL Query Cach

MySQL存储过程详解 mysql 存储过程

MySQL存储过程详解  mysql 存储过程 (2010-12-13 10:59:38) 转载▼ 标签: it 分类: mysql mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保

详解mysql中的Using与On的用法

多用才可以体会各个关键字的用法啊... 原文来自[http://bbs.php100.com/read-htm-tid-148469.html] 在用Join进行多表联合查询时,我们通常使用On来建立两个表的关系.其实还有一个更方便的关键字,那就是Using.那么这两个关键字在使用上有啥区别呢?往下看.假设有如下两张表:    mysql> select * from pets; +---------+---------+--------+-----------+ | pets_id | ani

pt-query-digest详解慢查询日志(转)

一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的MySQL协议数据来进行分析.可以把分析结果输出到文件中,分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间.次数.占比等,可以借助分析结果找出问题进行优化. 二.安装pt-query-digest 1.下载页面:https://www.pe

详解mysql复制机制--异步复制,半同步复制和并行复制

详解MySQL复制机制--异步复制,半同步复制和并行复制 **# 异步复制 异步复制是MySQL自带的最原始的复制方式,主库和备库成功建立复制关系后,在备库上会有一个IO线程去主库拉取binlog,并将binlogx到本地,就是下图中Relaylog,然后备库会开启另外一个SQL线程取回放Relay log,通过这种方式达到Master-Slave数据同步的目的. 通常情况下,slave是只读的,可以承担一部分读流量,而且可以根据实际需要,添加一个或者多个slave,这样在一定程度上可以缓解主库

详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC 我先挖个坑,日后再细讲,这篇文章我们主要来谈谈那些可爱的锁. 什么是幻读? 幻读是在可重复读的事务隔离级别下会出现的一种问题,简单来说,可重复读保证了当前事务不会读取到其他事务已提交的 UPDATE 操作.但同时,也会导致当前事务无法感知到来自其他事务中的 INSERT 或 DELETE 操作,这就

Mysql查询缓存碎片、缓存命中率及Nagios监控

Mysql 的优化方案,在互联网上可以查找到非常多资料,今天对Mysql缓存碎片和命中率作了详细了解,个人作了简单整理. 一.Mysql查询缓存碎片和缓存命中率. mysql> SHOW STATUS LIKE 'qcache%'; +-------------------------+-----------+ | Variable_name | Value | +-------------------------+-----------+ | Qcache_free_blocks | 5 |