众所周知,缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。对于MySQL数据库来说,也是得益于MySQL缓存机制,才能够提高MySQL数据库的性能,减少数据的内存占比。

MySQL缓存机制简单的说就是缓存SQL文本及查询结果,如果运行相同的SQL,服务器直接从缓存中取到结果,而不需要再去解析和执行SQL。如果表更改了,那么使用这个表的所有缓存查询将不再有效,查询缓存中值相关条目被清空。这里的更改指的是表中任何数据或是结构发生改变,包括INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表使用MERGE表的查询。显然,这对于频繁更新的表,查询缓存是不适合的,而对于一些不常改变数据且有大量相同SQL查询的表,查询缓存会节约很大的性能。

一、MySQL缓存规则

1.开启了缓存,MySQL Server会自动将查询语句和结果集返回到内存,下次再查直接从内存中取;

2.缓存的结果是通过sessions共享的,所以一个client查询的缓存结果,另一个client也可以使用。

3.MySQL Query Cache内容为 select 的结果集, cache 使用完整的SQL字符串做 key, 并区分大小写,空格等。即两个SQL必须完全一致才会导致cache命中。即检查查询缓存时,MySQL Server不会对SQL做任何处理,它精确的使用客户端传来的查询,只要字符大小写或注释有点不同,查询缓存就认为是不同的查询;

4.prepared statement永远不会cache到结果,即使参数完全一样。在 5.1 之后会得到改善。

5.where条件中如包含任何一个不确定的函数将永远不会被cache, 比如current_date, now等。

6.date 之类的函数如果返回是以小时或天级别的,最好先算出来再传进去。

select * from foo where date1=current_date -- 不会被 cache

select * from foo where date1='2008-12-30' -- 被cache, 正确的做法

7.太大的result set不会被cache (< query_cache_limit)

8.MySQL缓存在分库分表环境下是不起作用的

9.执行SQL里有触发器,自定义函数时,MySQL缓存也是不起作用的

二、缓存失效

在表的结构或数据发生改变时,查询缓存中的数据不再有效。如INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE会导致缓存数据失效。所以查询缓存适合有大量相同查询的应用,不适合有大量数据更新的应用。

一旦表数据进行任何一行的修改,基于该表相关cache立即全部失效。

手动清理缓存

手动清理缓存可以使用下面三个SQL

1.FLUSH QUERY CACHE; #清理查询缓存内存碎片

2.RESET QUERY CACHE;#从查询缓存中移除所有查询

3.FLUSH TABLES; #关闭所有打开的表,同时该操作会清空查询缓存中的内容

四、缓存机制中的内存管理

MySQL Query Cache 使用内存池技术,自己管理内存释放和分配,而不是通过操作系统。内存池使用的基本单位是变长的block, 用来存储类型、大小、数据等信息;一个result set的cache通过链表把这些block串起来。block最短长度为query_cache_min_res_unit。

当服务器启动的时候,会初始化缓存需要的内存,是一个完整的空闲块。当查询结果需要缓存的时候,先从空闲块中申请一个数据块为参数query_cache_min_res_unit配置的空间,即使缓存数据很小,申请数据块也是这个,因为查询开始返回结果的时候就分配空间,此时无法预知结果多大。

分配内存块需要先锁住空间块,所以操作很慢,MySQL会尽量避免这个操作,选择尽可能小的内存块,如果不够,继续申请,如果存储完时有空余则释放多余的。

但是如果并发的操作,余下的需要回收的空间很小,小于query_cache_min_res_unit,不能再次被使用,就会产生碎片。

MySQL缓存机制从某种程度上来说,和其他的系统缓存有类似的作用:提高系统的性能,释放系统的内存空间。但MySQL缓存机制又有着其独特的特性,对于数据重复性比较高的查询有着显著的作用。想要学习更多的MySQL知识,敬请期待本站的MySQL教程,名师讲解,各种知识点一目了然。

mysql的缓存机制是什么意思_MySQL缓存机制详解相关推荐

  1. mysql查询跟某个人同在部门_MySQL 查询习题详解

    用sql sever  不显示列名 需要加dbo 1.首先进行建表: #建学生信息表studentcreate tablestudent ( snovarchar(20) not null prima ...

  2. mysql5.7.11 linux_CentOS 7 中以命令行方式安装 MySQL 5.7.11 for Linux Generic 二进制版本教程详解...

    MySQL 目前的最新版本是 5.7.11,在 Linux 下提供特定发行版安装包(如 .rpm)以及二进制通用版安装包(.tar.gz).一般情况下,很多项目都倾向于采用二进制通用安装包形式来进行安 ...

  3. mysql my.ini 详解_mysql my.ini 详解

    basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的目录. datadir = path 从给定目录读取数据库文件 ...

  4. mysql特点_Mysql 三大特性详解

    Mysql Innodb后台线程 工作方式 首先Mysql进程模型是单进程多线程的.所以我们通过ps查找mysqld进程是只有一个. 体系架构 InnoDB存储引擎的架构如下图所以,是由多个内存块组成 ...

  5. mysql如何查看事务日记_MySQL日志查看详解

    解决问题: 了解MySQL日志? 怎样查看错误日志? 怎样查看慢日志? 1. MySQL日志分类? MySQL日志主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志. 1.1 错误日志: ...

  6. mysql 用户管理表_Mysql—用户表详解(mysql.user)

    MySQL 数据库 Mysql-用户表详解(mysql.user) MySQL是一个多用户管理的数据库,可以为不同用户分配不同的权限,分为root用户和普通用户,root用户为超级管理员,拥有所有权限 ...

  7. mysql单表查询实例_MySQL简单查询详解-单表查询

    MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...

  8. mysql.user表_mysql.user表详解

    GRANT语法: GRANT 权限 ON 数据库.* TO 用户名@'登录主机' IDENTIFIED BY '密码' 权限: ALL,ALTER,CREATE,DROP,SELECT,UPDATE, ...

  9. mysql explain语句_Mysql explain 语句详解

    explain 语句详解 explain 写在 select 前,如下 mysql> explain select * from user_info where id = 2\G ******* ...

最新文章

  1. 【组队学习】【29期】Datawhale组队学习内容介绍
  2. 别再说你不懂Linux内存管理了,10张图给你安排的明明白白!
  3. java线程 教程_Java多线程系列教程
  4. hotspot 垃圾收集器_HotSpot增量Java垃圾收集器
  5. 理论基础 —— 图 —— 图的存储结构
  6. 比特币最主流,以太坊大跌,区块链技术“万金油”红利已结束 | 区块链开发者年度报告...
  7. 「CSDN年度征文」微软学生大使、VSC中文社区、KDD CUP...2020年,我与技术社区
  8. 什么是编译器(编程软件)?
  9. Linux下用ffmpeg轉PSP影片 (MP4/AVC格式)
  10. 基于OpenCV的PHP图像人脸检测识别…
  11. Spring学习-黎活明视频学习注解
  12. 大话2正在连接登录服务器,大话西游手游服务器连接失败进不去解决办法
  13. STM32---定时器的ETR功能
  14. nbu Linux 邮件告警,NBU常用命令1——介质管理
  15. 为扫描版PDF一键生成目录
  16. 串口干扰 linux复位,消除RS422串口干扰的方法与流程
  17. 潍职单招试题计算机模拟题,2018年四川省高职单招数学试题.doc
  18. 软件加密系统Themida常见问题集锦—Themida是否支持命令行保护?
  19. AjaxPro.NET使用,方便的在客户端直接调用服务端方法
  20. 文本比较算法Ⅰ——LD算法

热门文章

  1. IBM 技术文档:Spark, 快速数据分析的又一选择
  2. 【2021-01-14】navicat使用ssh tunnel、密钥方式连接数据库的问题。错误:Unable to load key - unrecognised cipher name
  3. 汇编语言ax=0c58ch,第4章89C5汇编语言程序设计.ppt
  4. python pca降维_MLK | 机器学习的降维quot;打击quot;
  5. zstack信道_Zigbee信道原理
  6. python自动化控制运动_Python +selenium自动化帮你预订运动场地
  7. 四川南充计算机经贸学校,四川南充工贸学校计算机应用专业秋季计划
  8. python实现ai聊天机器人_AI人工智能Python实现简单人机对话:你好,人类!
  9. Python编程基础07:选择结构
  10. 大数据学习笔记35:Hive - 内部表与外部表