查询缓存原理
缓存
SELECT
操作或预处理查询的结果集和
SQL
语句,当有新的
SELECT
语句或预处理查询语句请求,先去查询缓存,判断是否存在可用的记录集,判断标准:与缓存的SQL
语句,是否完全一样,
区分大小写
查询缓存相关的服务器变量
03:48:46(root@localhost) [(none)]> show variables like 'query_%';
+------------------------------+----------+
| Variable_name | Value |
+------------------------------+----------+
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 33554432 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
+------------------------------+----------+
7 rows in set (0.01 sec)
query_cache_min_res_unit
:查询缓存中内存块的最小分配单位,默认
4k
,较小值会减少浪费, 但会导致更频繁的内存分配操作,较大值会带来浪费,会导致碎片过多,内存不足
query_cache_limit
:单个查询结果能缓存的最大值,单位字节,默认为
1M
,对于查询结果过大而无法缓存的语句,建议使用SQL_NO_CACHE
query_cache_size
:查询缓存总共可用的内存空间;单位字节,必须是
1024
的整数倍,最小值40KB,低于此值有警报
query_cache_wlock_invalidate
:如果某表被其它的会话锁定,是否仍然可以从查询缓存中返回结 果,默认值为OFF
,表示可以在表被其它会话锁定的场景中继续从缓存返回数据;
ON
则表示不允
许
query_cache_type
:是否开启缓存功能,取值为
ON, OFF, DEMAND
查询缓存相关的状态变量
04:00:22(root@localhost) [(none)]> show global status like 'Qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 33537320 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 2 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+----------+
8 rows in set (0.00 sec)
MySQL8.0 取消查询缓存的功能
尽管
MySQL Query Cache
旨在提高性能,但它存在严重的可伸缩性问题,并且很容易成为严重的瓶 颈。
自
MySQL 5.6
(
2013
)以来,默认情况下已禁用查询缓存,其不能与多核计算机上在高吞吐量工作负载情况下进行扩展
目前大多数应用都把缓存做到了应用逻辑层,比如
:
使用
redis
或者
memcache