MySQL 查询缓存
1. 版本信息
|
|
2. 查询缓存参数
可以使用以下命令来查看MySQL查询缓存相关的系统参数配置:
|
|
参数 | 描述 |
---|---|
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. 查询缓存性能参数
可以使用以下命令来查看查询缓存的性能参数:
|
|
参数 | 描述 |
---|---|
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 服务。
|
|
或者使用命令行方式,该方式需要退出客户端再登录,才看得见状态改变:
|
|
set GLOBAL
的变更是全局的,如果只想将变更应用于当前的会话,可是使用set SESSION
的方式:
|
|
5. 使用查询缓存
MySQL 的查询缓存对查询语句的大小写是敏感的,只有当两个查询语句完全一致时,才会命中缓存。
第一次查询一张100万条数据的表,耗时1.63秒:
|
|
第二次查询同一张表,耗时为0,可见是直接命中查询缓存:
|
|
第三次查询将SELECT
改写成select
,耗时1.57秒,可见并没有命中缓存:
|
|
6. 整理查询缓存
用于对查询缓存的内存块进行整理,减少内存碎片:
|
|
6. 清除查询缓存
用于清除所有缓存的查询缓存结果:
|
|