1. 版本信息

1
2
3
4
5
6
SELECT VERSION();
+------------+
| version() |
+------------+
| 5.7.21-log |
+------------+

2. 查询缓存参数

可以使用以下命令来查看MySQL查询缓存相关的系统参数配置:

1
2
3
4
5
6
7
8
9
10
11
SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
参数 描述
have_query_cache 表明查询缓存是否可用。当使用标准的MySQL二进制文件时,该项的值始终会显示YES,即使查询缓存已经关闭。
query_cache_limit 缓存单条查询结果的最大空间容量值。超出则不会缓存此次查询的结果。默认是1M (1048576(B)/1024/1024=1M)。
query_cache_min_res_unit 分配缓存区大小的最小单位。当查询的结果被缓存时,MySQL不会一次性将结果缓存到一个大的块中,而是每次分配一块该值大小的空间,使用完之后再分配另外一块,以此类推。
默认是4KB (4096(B)/1024=4KB)。注意事项:
1) 该参数值如果设置的过大,可能会造成大量的空间未能被完全使用,而产生内存碎片。
2) 该参数值如果设置的太小,又可能会增加内存分配次数,进而产生时间上的消耗。
query_cache_size 查询缓存空间的大小。该值设置的如果不是1024的整数倍,MySQL自动调整降低最小量以达到1024的倍数。如果设置为0,则会禁用查询缓存。
query_cache_type 查询缓存的类型。可以用来控制查询缓存的开和关。
1) 0或OFF表示关闭查询缓存;
2) 1或ON表示开启查询缓存;
3) 2或DEMAND时:
 a) 当SELECT语句中出现SQL_NO_CACHE关键字时则不缓存;
 select SQL_NO_CACHE id, name from tb;
 b) 当出现SQL_CACHE关键字则缓存(默认是SQL_CACHE)。
 select SQL_CACHE id, name from tb;
query_cache_wlock_invalidate 当写锁发生在表上的时,是否先失效该表相关的查询缓存。
1) 设置为true,失效该表相关的查询缓存;
2) 设置为false,仍然允许读取该表相关的查询缓存;

3. 查询缓存性能参数

可以使用以下命令来查看查询缓存的性能参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
SHOW STATUS LIKE 'Qcache%';
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1029312 |
| Qcache_hits | 2 |
| Qcache_inserts | 2 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 1 |
| Qcache_queries_in_cache | 2 |
| Qcache_total_blocks | 6 |
+-------------------------+---------+
参数 描述
Qcache_free_blocks 查询缓存中的空闲内存块的数量。如果数值较大,说明有内存碎片产生。可以使用FLUSH QUERY CACHE命令对查询缓存中的内存块进行整理。
Qcache_free_memory 查询缓存中的空闲内存大小。
Qcache_hits 缓存命中的次数。每次命中,该数值+1。
Qcache_inserts 添加到查询缓存中的查询数量。每新缓存一个查询结果,该数值+1。
Qcache_lowmem_prunes 查询缓存可用空间不足时而删除的已缓存的查询的数量。如果数值较大,说明查询缓存的内存空间不足,或产生了大量的内存碎片。
Qcache_not_cached 非缓存查询的数量。每个查询的结果如果不能被缓存,该数值+1。
Qcache_queries_in_cache 查询缓存中的总的查询数量。
Qcache_total_blocks 查询缓存中的块的数量。

4. 查询缓存的开启和关闭

MySQL5.7 默认没有开启查询缓存。如果需要开启查询缓存,找到安装目录下的my.ini(Windows)配置文件,添加如下配置,然后重启 MySQL 服务。

1
2
3
4
[mysqld]
... ...
... ...
query_cache_type=1

或者使用命令行方式,该方式需要退出客户端再登录,才看得见状态改变:

1
SET GLOBAL query_cache_type=1;

set GLOBAL的变更是全局的,如果只想将变更应用于当前的会话,可是使用set SESSION的方式:

1
SET SESSION query_cache_type=1;

5. 使用查询缓存

MySQL 的查询缓存对查询语句的大小写是敏感的,只有当两个查询语句完全一致时,才会命中缓存。

第一次查询一张100万条数据的表,耗时1.63秒:

1
2
3
4
5
6
7
SELECT COUNT(*) FROM emp;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (1.63 sec)

第二次查询同一张表,耗时为0,可见是直接命中查询缓存:

1
2
3
4
5
6
7
SELECT COUNT(*) FROM emp;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (0.00 sec)

第三次查询将SELECT改写成select,耗时1.57秒,可见并没有命中缓存:

1
2
3
4
5
6
7
select COUNT(*) FROM emp;
+----------+
| count(*) |
+----------+
| 1000000 |
+----------+
1 row in set (1.57 sec)

6. 整理查询缓存

用于对查询缓存的内存块进行整理,减少内存碎片:

1
FLUSH QUERY CACHE;

6. 清除查询缓存

用于清除所有缓存的查询缓存结果:

1
RESET QUERY CACHE;