MySQL/MariaDB的查询缓存

查询缓存:

缓存的数据:k/v,即键值对;

key:查询语句的hash值;

value:查询语句的查询结果;

判断缓存是否命中标准:

通过整个查询语句的hash值的比较,完全相同则命中;

有些查询结果是不能被缓存的:

要查询的数据库中可能包含敏感信息

在查询语句中包含有用户自定义的函数(UDF);

存储函数;

用户自定义变量;

对于临时表发起的查询请求;

包含列级别授权的查询;

有着不确定结果值的mysql的内建函数:

如:NOW(), CURRENT_DATE(), CURRENT_TIME(), CURRENT_USER(),...

在mysql数据库查询缓存相关的服务器变量:

MariaDB [(none)]> show global variables like 'query_cache%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 0       |
| query_cache_strip_comments   | OFF     |
| query_cache_type             | ON      |
| query_cache_wlock_invalidate | OFF     |
+------------------------------+---------+
6 rows in set (0.00 sec)

query_cache_limit:能够缓存的查询结果的最大字节数上限

query_cache_min_res_unit:查询缓存中内存块的最小分配单元;

query_cache_size:查询缓存申请的在内存中的总可用空间;

query_cache_strip_comments:用于控制是否去掉SQL查询语句中的注释部分之后在作为key存入查询缓存中。

query_cache_type:缓存功能开启与否的开关:

query_cache_wlock_invalidate:如果某个连接会话对某表施加了写锁,是否依然可以从缓存中查询并返回查询结果;

想要查看缓存服务器状态参数,就要设置查询缓存申请的内存空间的大小,必须是1024的整数倍;

MariaDB [(none)]> set @@global.query_cache_size=134217728;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> show global status like 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 134198384 |
| Qcache_hits             | 1         |
| Qcache_inserts          | 1         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 1         |
| Qcache_queries_in_cache | 1         |
| Qcache_total_blocks     | 4         |
+-------------------------+-----------+
8 rows in set (0.00 sec)

Qcache_free_blocks:表示查询缓存中目前还剩余多少个blocks;

Qcache_free_memory:查询缓存中还空闲的内存空间;

Qcache_hits:表示查询缓存中查询语句的命中次数。数字越大,缓存效果越理想;

Qcache_lowmem_prunes:该参数记录了有多少条查询请求是因为内存空间不足而基于LRU算法被移出缓存的;如果该数值较大,则表示为查询缓存分配的内存空间太小;

Qcache_not_cached:取决于query_cache_type变量的设置的作用下,没有被缓存的查询请求的数量;

Qcache_queries_in_cache:当前查询缓存中缓存的查询请求的结果的数量;

Qcache_total_blocks:当前查询缓存中总计分配了多少个block;

缓存命中率的计算:

Qcache_hits/(Qcache_hits + Qcache_inserts)

通过查看服务器参数区别,来判断是否命中缓存;

首先,查看表内容,然后查看参数,在查看表内容,在查看参数;

MariaDB [hellodb]> select * from coc;
+----+---------+----------+
| ID | ClassID | CourseID |
+----+---------+----------+
|  1 |       1 |        2 |
|  2 |       1 |        5 |
|  3 |       2 |        2 |
|  4 |       2 |        6 |
|  5 |       3 |        1 |
|  6 |       3 |        7 |
|  7 |       4 |        5 |
|  8 |       4 |        2 |
|  9 |       5 |        1 |
| 10 |       5 |        9 |
| 11 |       6 |        3 |
| 12 |       6 |        4 |
| 13 |       7 |        4 |
| 14 |       7 |        3 |
+----+---------+----------+
14 rows in set (0.00 sec)

MariaDB [hellodb]> show global status like 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 134198384 |
| Qcache_hits             | 0         |
| Qcache_inserts          | 1         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 1         |
| Qcache_queries_in_cache | 1         |
| Qcache_total_blocks     | 4         |
+-------------------------+-----------+
8 rows in set (0.00 sec)

MariaDB [hellodb]> select * from coc;
+----+---------+----------+
| ID | ClassID | CourseID |
+----+---------+----------+
|  1 |       1 |        2 |
|  2 |       1 |        5 |
|  3 |       2 |        2 |
|  4 |       2 |        6 |
|  5 |       3 |        1 |
|  6 |       3 |        7 |
|  7 |       4 |        5 |
|  8 |       4 |        2 |
|  9 |       5 |        1 |
| 10 |       5 |        9 |
| 11 |       6 |        3 |
| 12 |       6 |        4 |
| 13 |       7 |        4 |
| 14 |       7 |        3 |
+----+---------+----------+
14 rows in set (0.00 sec)

MariaDB [hellodb]> show global status like 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 134198384 |
| Qcache_hits             | 1         |
| Qcache_inserts          | 1         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 1         |
| Qcache_queries_in_cache | 1         |
| Qcache_total_blocks     | 4         |
+-------------------------+-----------+
8 rows in set (0.00 sec)

通过Qcache_hits参数比较,可以发现,通过Qcache_inserts添加缓存之后,再次输入查询语句,是从缓存中提取的结果;

需要注意,如果对表进行了写操作(增、删、改),则MySQL会自动将查询缓存中与该表相关的所有缓存项全部清除;因此,与此表相关的查询请求必须重新构建缓存内容;

原文地址:http://blog.51cto.com/liujingyu/2151194

时间: 2024-10-13 20:53:04

MySQL/MariaDB的查询缓存的相关文章

数据库MySQL/mariadb知识点——查询缓存

查询的执行路径 SQL语句 查询缓存 解析器 解析树 预处理 查找最好的查询路径 查询优化SQL语句 执行计划 API调用存储引擎 调用数据,返回结果 缓存SELECT操作或预处理查询的结果集和SQL语句,当有新的SELECT语句或预处理查询语句请求,先去查询缓存,判断是否存在可用的记录集,判断标准:与缓存的SQL语句,是否完全一样,区分大小写. 不需要对SQL语句做任何解析和执行,当然语法解析必须通过在先,直接从Query Cache中获得查询结果,提高查询性能 查询缓存的判断规则,不够智能,

MySQL 权限和查询缓存

MySQL 权限和查询缓存 ================================================================================ 概述: ================================================================================ MySQL用户和权限管理    1.权限类别 ★用户账号:[email protected] user:账户名称: host:此账户可通过哪

mysql query cache 查询缓存

查看本博文,并进行验证(验证结果与博文一致): https://blog.csdn.net/carmazhao/article/details/7088530 mysql默认是开启查询缓存的. 设置查询缓存的内存大小: 查询缓存的命中次数查询: 再执行相同sql4次: 插入数据后: 紧接着执行相同的sql,没有命中查询缓存 插入数据后,第二次执行相同的sql,命中查询缓存 原文地址:https://www.cnblogs.com/hblthink/p/8799229.html

《高性能MySQL》读书笔记--查询缓存

1.MySQL查询缓存 很多数据库产品都能够缓存查询的执行计划,对于相同类型的SQL就可以跳过SQL解析和执行计划生成阶段.MySQL还有另一种不同的缓存类型:缓存完整的SELECT查询结果,也就是"查询缓存". 查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有的缓存数据都将失效. 查询缓存对应用程序是完全透明的.应用程序无须关心MySQL是通过查询缓存返回的结果还是实际执行返回的结果. 另外,随着现在的通用服务器越来越强大,查询缓存可能是一个影响服务器

Mysql 查询缓存利弊

Mysql 查询缓存总结 MySQL查询缓存解释 缓存完整的SELECT查询结果,也就是查询缓存.保存查询返回的完整结果.当查询命中该缓存,mysql会立刻返回结果,跳过了解析.优化和执行阶段, 查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有数据都将失效 命中条件 Mysql判断缓存命中的方法很简单:缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括如下因素,即查询本身.当前要查询的数据库.客户端协议的版本等一些都有可能影响返回结果信息. 当判断查询缓存

MySQL/MariaDB基础

数据库管理系统很早就有了,在最开始时,数据库管理的结构是层次化的,即层次模型,它是一个树形结构,可以通过有限次的查找来定位需要的数据,然而,这种查找还是需要遍历才能实现,所以这种模型应用时间不长久:之后有了网状模型,也就是多个树的集合:层次模型和网状模型都称为非关系型数据库.之后由Edgar Frank Codd提出了一个关系型数据库的模型,从此之后就有了关系模型,其中Oracle公司就是以此为原型开发了Oracle数据库:到现在又提出了反关系模型--No-SQL,它是非关系型的数据库,例如:键

关于数据库管理系统DBMS--关系型数据库(MySQL/MariaDB)

数据库管理系统--DBMS:用来管理数据库 数据库的结构(3种):层次,网状,关系型(用的最多): DBMS的三层模型: 视图层:面向最终用户: 逻辑层:面向程序员或DBA: 物理层:面向系统管理员: 关系型数据库管理系统--RDBMS: 主要的组成部分是表:表是由行(实例,实体,记录)和列(字段,域)组成: 关系型数据库管理系统的实现: 商业方案:Oracle,Sybase{为微软提供了思路出现SQL-server},Infomix{IBM收购},DB2{IBM} 开源方案:PostgreSQ

MySQL查询缓存

一.查询缓存说明 MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中.当客户端发起SQL查询时,Query Cache的查找逻辑是,先对SQL进行相应的权限验证,接着就通过Query Cache来查找结果(注意必须是完全相同,即使多一个空格或者大小写不 同都认为不同,即使完全相同的SQL,如果使用

MySQL用户、[表库字段]权限、管理及查询缓存详解

MySQL用户管理: mysql> help contents; You asked for help about help category: "Contents" For more information, type 'help <item>', where <item> is one of the following categories:    Account Management    Administration    Compound Sta