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的倍数。