配置文件设置缓存

query_cache_size = 20M  #缓存大小
query_cache_type = ON #开启缓存
table_cache=256 #用于限制缓存表的最大数目,如果当前已经缓存的表未达到table_cache,则会将新表添加进来;若已经达到此值,MySQL将根据缓存表的最后查询时间、查询率等规则释放之前的缓存

查询缓存配置
have_query_cache服务器系统变量指示查询缓存是否可用:YES可用,NO不可用

mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+

要设置查询缓存的大小,请设置 query_cache_size系统变量。将其设置为0将禁用查询缓存。query_cache_type=0禁用查询缓存

设置query_cache_size 为非零值时,请记住查询缓存需要最小大小约为40KB才能分配其结构。(确切的大小取决于系统体系结构。)如果将该值设置得太小,则会收到警告,如以下示例所示:

mysql> SET GLOBAL query_cache_size = 40000;
Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Warning
Code: 1282
Message: Query cache failed to set size 39936;
new query cache size is 0 mysql> SET GLOBAL query_cache_size = 41984;
Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| query_cache_size | 41984 |
+------------------+-------+

为了使查询缓存实际上能够保存任何查询结果,必须将其大小设置为更大:

mysql> SET GLOBAL query_cache_size = 1000000;
Query OK, 0 rows affected (0.04 sec) mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| query_cache_size | 999424 |
+------------------+--------+
1 row in set (0.00 sec)

该query_cache_size值与最接近的1024字节块对齐。因此,报告的值可能与您分配的值不同。

如果查询缓存大小大于0,则 query_cache_type变量会影响其工作方式。可以将此变量设置为以下值:

0或OFF 禁用缓存。

1或ON 启用缓存,但以开头的语句除外 SELECT SQL_NO_CACHE。

2或 DEMAND导致仅缓存以开头的语句SELECT SQL_CACHE。

如果query_cache_size为0,则还应该将query_cache_type变量设置 为0。在这种情况下,服务器根本不会获取查询缓存互斥量,这意味着无法在运行时启用查询缓存,并且减少了查询执行的开销。

设置该GLOBAL query_cache_type值可确定更改后连接的所有客户端的查询缓存行为。各个客户端可以通过设置SESSION query_cache_type值来控制自己连接的缓存行为 。例如,客户端可以禁止对自己的查询使用查询缓存,如下所示:

mysql> SET SESSION query_cache_type = OFF;

如果query_cache_type 在服务器启动时(而不是在运行时使用 SET 语句)进行设置,则仅允许数字值。

要控制可缓存的单个查询结果的最大大小,请设置 query_cache_limit系统变量。默认值为1MB。

注意不要将缓存的大小设置得太大。由于在更新过程中需要线程锁定高速缓存,因此您可能会看到高速缓存非常大的锁定争用问题。

注意
SET 通过使用 命令行或配置文件中的选项,
可以使用语句设置 在运行时为查询缓存指定的最大大小 。
--maximum-query_cache_size=32M
也可以直接修改my.cnf文件 ,在msqld下直接添加 query_cache_size = 32M

当要缓存查询时,其结果(发送到客户端的数据)将在结果检索期间存储在查询缓存中。因此,通常不会大批量处理数据。查询高速缓存分配块以按需存储此数据,因此当一个块被填充时,将分配一个新块。由于内存分配操作成本高昂(按时间排列),因此查询缓存将分配具有query_cache_min_res_unit 系统变量给定的最小大小的块 。执行查询时,将最后一个结果块修剪为实际数据大小,以便释放未使用的内存。根据服务器执行的查询类型,您可能会发现调整以下值会有所帮助 query_cache_min_res_unit:

默认值为 query_cache_min_res_unit 4KB。对于大多数情况,这应该足够了。

如果您有很多查询但结果很少,则默认的块大小可能会导致内存碎片,这由大量的空闲块指示。由于内存不足,碎片可能会迫使查询缓存从缓存中修剪(删除)查询。在这种情况下,减小的值 query_cache_min_res_unit。由于修剪而删除的空闲块和查询的数量由Qcache_free_blocks和 Qcache_lowmem_prunes 状态变量的值给出 。

如果大多数查询的结果较大(请检查 Qcache_total_blocks和 Qcache_queries_in_cache 状态变量),则可以通过提高来提高性能 query_cache_min_res_unit。但是,请注意不要使其过大

您可以对查询缓存进行碎片整理,以更好地利用该FLUSH QUERY CACHE语句的内存。该语句不会从缓存中删除任何查询。

该RESET QUERY CACHE语句从查询缓存中删除所有查询结果。该 FLUSH TABLES语句也这样做。

要监视查询缓存性能,请使用 SHOW STATUS来查看缓存状态变量:

mysql> SHOW STATUS LIKE 'Qcache%';
+-------------------------+--------+
| Variable_name | Value |
+-------------------------+--------+
| Qcache_free_blocks | 36 | #查询缓存中的可用内存块数
| Qcache_free_memory | 138488 | #查询缓存的可用内存量
| Qcache_hits | 79570 | #查询缓存命中数
| Qcache_inserts | 27087 | #添加到查询缓存中的查询数
| Qcache_lowmem_prunes | 3114 | #由于内存不足而从查询缓存中删除的查询数
| Qcache_not_cached | 22989 | #非缓存查询的数量(不可缓存或由于query_cache_type 设置而未被缓存)。
| Qcache_queries_in_cache | 415 | #在查询缓存中注册的查询数
| Qcache_total_blocks | 912 | #查询缓存中的块总数。
+-------------------------+--------+

查询缓存使用可变长度的块,因此 Qcache_total_blocks并 Qcache_free_blocks可能指示查询缓存内存碎片。之后 FLUSH QUERY CACHE,仅剩下一个空闲块。

mysql> flush query cache;
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables;   #清空当前所有缓存的表
Query OK, 0 rows affected (0.00 sec)
mysql> reset query cache; #清理内存中的碎片
Query OK, 0 rows affected (0.00 sec)

每个缓存的查询至少需要两个块(一个用于查询文本,一个或多个用于查询结果)。同样,查询使用的每个表都需要一个块。但是,如果两个或多个查询使用同一张表,则只需要分配一个表块。

Qcache_lowmem_prunesstatus变量 提供的信息 可以帮助您调整查询缓存的大小。它计算从缓存中删除的查询数,以释放内存以缓存新查询。查询缓存使用最近最少使用(LRU)策略来决定从缓存中删除哪些查询。

MySQL配置缓存查询和维护的更多相关文章

  1. Mysql 配置慢查询日志(SlowQueryLog)以及使用日志分析工具

    [ 查看系统关于慢查询的设置 ] mysql> show variables like '%slow%'; +---------------------------+-------------- ...

  2. SpringMVC+Mybatis+MySQL配置Redis缓存

    SpringMVC+Mybatis+MySQL配置Redis缓存 1.准备环境: SpringMVC:spring-framework-4.3.5.RELEASE-dist Mybatis:3.4.2 ...

  3. MySQL慢日志查询全解析:从参数、配置到分析工具【转】

    转自: MySQL慢日志查询全解析:从参数.配置到分析工具 - MySQL - DBAplus社群——围绕数据库.大数据.PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群http://dbap ...

  4. MySql 缓存查询原理与缓存监控 和 索引监控

    MySql缓存查询原理与缓存监控 And 索引监控 by:授客 QQ:1033553122 查询缓存 1.查询缓存操作原理 mysql执行查询语句之前,把查询语句同查询缓存中的语句进行比较,且是按字节 ...

  5. centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课

    centos  LAMP第四部分mysql操作  忘记root密码  skip-innodb 配置慢查询日志 mysql常用操作  mysql常用操作 mysql备份与恢复   第二十二节课 mysq ...

  6. MySql配置参数很全的Mysql配置参数说明

    MySql配置参数 很全的Mysql配置参数说明 1. back_log 指定MySQL可能的连接数量.当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很 ...

  7. MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询

    本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...

  8. MySQL慢日志查询分析方法与工具

    MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句. 2)慢查 ...

  9. MySQL配置

    一.登录MySQL 要登录到MySQL只需要使用如下命令. mysql -h localhost -u root -p localhost:IP地址: root:用户名: database:数据库名( ...

  10. mysql笔记03 查询性能优化

    查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...

随机推荐

  1. __int128的输入输出(快读快输)

    引言:__int128不能用\(cin\)\(cout\)或\(scanf\)\(printf\). 快读 思想:把每一个字符读入,组成数字. int read(){ int x = 0,y = 1; ...

  2. RHCA rh442 003 系统资源 查看硬件 tuned调优

    监控工具 zabbix 监控具体业务,列如数据库.触发式事件(断网 硬盘坏一个) 普罗米修斯 给容器做监控 管理人员,如何知道几千台服务器哪些出了问题,这得需要zabbix 系统硬件资源 cpu [r ...

  3. adb对安卓app进行抓包(ip连接设备)

    adb对安卓app进行抓包(ip连接设备) 一,首先将安卓设备的开发者模式打开,提示允许adb调试 二,自己的笔记本要和安卓设备在同一个网段下(同连一个WiFi就可以了) 三,在笔记本上根据ip来连接 ...

  4. 【YAML】非标记语言的标记语言

    什么是YAML? YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写. 在开发的这种语言时,YAML 的意思其实是:&qu ...

  5. 【SpringBoot】Re 02 Import与自定义装配实现

    Import的注册形式: 1.使用@Import导入一个或者多个类字节对象 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME ...

  6. [SDOI2012] 走迷宫 题解

    前言 题目链接:洛谷:Hydro & bzoj. 题意简述 有向图中,求起点到终点的期望步数.若期望不存在,输出 INF. 保证强连通分量的大小不超过 \(100\). 题目分析 首先来想想什 ...

  7. 利用Linux系统提供的和调度器相关的接口让进程或线程对某个处理器进行绑定

    目录 设置进程与CPU的亲和性 设置线程与CPU的亲和性 设置进程与CPU的亲和性 taskset命令允许你查看或设置运行中的进程的CPU亲和性(即该进程可以在哪些CPU上运行). 要将一个已经运行的 ...

  8. 第 356 场周赛 - 力扣(LeetCode)

    第 356 场周赛 - 力扣(LeetCode) 2798. 满足目标工作时长的员工数目 - 力扣(LeetCode) 一次遍历 class Solution { public: int number ...

  9. 关于Arrays.asList返回List无法新增和删除?

    关于Arrays.asList返回的List无法新增和删除? 这个是在写项目的时候发现的,然后就分析了一下源码,得其内部原理 复现代码示例: public class ArraysAsList { p ...

  10. Oracle同一台服务器创建多个数据库

    有时候我们需要再同一台机器上创建多个数据库服务(不是单纯的数据库实例),每一个数据库可以有单独的服务运行,只是在一个机器环境而已.可以在不同的端口上监听,也可以在相同端口监听 创建多个数据库步骤 安装 ...