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. 整理查询缓存
用于对查询缓存的内存块进行整理,减少内存碎片:
6. 清除查询缓存
用于清除所有缓存的查询缓存结果: