MySQL必知必会 - 第一讲 Query Cache

552 阅读3分钟

MySQL必知必会 - 第一讲 Query Cache

在我们开发过程中,我们都会用到缓存,比如:Redis等进行数据的缓存,方便请求的时候,直接请求缓存,减少数据库的压力。MySQL中,也有这么一个缓存(Query Cache)。如果缓存是开启的,当我们请求达到DB的时候,就会先去请求缓存。

当数据库打开缓存的时候,数据库执行select操作的时候,会将结果放到Query Cache中,当下一次请求处理同样select请求的时候,就不需要去数据表中查询数据,直接返回缓存中数据就ok了。但是,Query Cache却是有很大的缺陷的。大家可以想想我们平时开发的时候,如果select查询有结果,我们会放到redis中,但是如果其他请求进行insert或者update,我们在执行完之后,都需要去删除缓存中的数据。所以,MySQL也是这种原则,如果执行"INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, or DROP DATABASE"等操作,那么缓存就会删除。在大部分业务中,我们的读写其实是比较频繁的,虽然可能读会远远大于写,但是这比例也不会特别大。所以这种经常修改表的场景下,建议关闭Query Cache。

如何关闭Query Cache:

首先涉及query_cache的两个核心参数:

show variables like '%query_cache%'

mysql> 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             | 599040  |      --查询缓存的大小
| query_cache_type             | ON      |      --是否支持查询缓存
| query_cache_wlock_invalidate | OFF     |      --控制当有写锁加在表上的时候,是否先让该表相关的 Query Cache失效
+------------------------------+---------+
6 rows in set (0.02 sec)
mysql> set global query_cache_size = 600000; --设置缓存内存大小
mysql> set global query_cache_type = ON;     --开启查询缓存
mysql> set global query_cache_size = 0; --设置缓存内存大小为0, 即初始化是不分配缓存内存
mysql> set global query_cache_type = OFF;     --关闭查询缓存

如果说想要开启Query Cache,建议在数据更新不频繁的场景下,比如说冷库,更新是按天或者周或者月更新,查询的时候,旧数据查询虽然不多,但是更新更不会频繁。甚至数据到最后也不会更新。

关闭缓存:

开启缓存:

query_cache_type:控制Query Cache功能的开关,可以设置为0(OFF),1(ON)和2(DEMAND)三种:0表示关闭Query Cache功能,任何情况下都不会使用Query Cache;1表示开启Query Cache功能,但是当SELECT语句中使用的SQL_NO_CACHE提示后,将不使用Query Cache;2(DEMAND)表示开启Query Cache功能,但是只有当SELECT语句中使用了SQL_CACHE提示后,才使用Query Cache。

query_cache_size:设置Query Cache所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL会自动调整降低最小量以达到1024的倍数。