MySQL 数据库查询缓存


MySQL 数据库查询缓存

MySQL 数据库的查询缓存功能默认是关闭的、默认不使用查询缓存,需要手动开启打开 query_cache_type 配置。
MySQL 数据库的查询缓存功能打开以后,当执行完全相同的 SQL 语句的时候,服务器就会直接从缓存中读取结果,当数据被修改则之前的缓存会失效,修改比较频繁的表不太适合做查询缓存。


MySQL 查询缓存的相关命令:

1,查询 MySQL 查询缓存功能是否可用(是否开启),默认YES、查询缓存功能可用:
show variables like 'have_query_cache';
select @@have_query_cache;

2,查询使用查询缓存的方式,默认OFF、不使用查询缓存:
show variables like 'query_cache_type';
select @@query_cache_type;

show global variables like 'query_cache_type';
select @@global.query_cache_type;

0 或 OFF:不使用查询缓存
1 或 ON:使用查询缓存
2 或 DEMAND:按需使用查询缓存,查询语句中显式指定 SQL_CACHE 的 SELECT 才会缓存(例如:SELECT SQL_CACHE id,info FROM test01;) ,否则均不使用查询缓存;

3,修改全局配置、设置使用查询缓存:
vi /etc/my.cnf

query_cache_type = 1

重启服务生效配置:
service mysqld restart


4,其他相关配置查看:
show variables like 'query_cache%';

mysql> show variables like 'query_cache%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 1048576 |
| query_cache_type             | OFF     |
| query_cache_wlock_invalidate | OFF     |
+------------------------------+---------+

query_cache_limit : 允许使用 MySQL 查询缓存的单条 Query 结果集占用内存的最大值,默认是 1MB,超出此大小的 SQL 语句结果集则不放入缓存。
query_cache_min_res_unit : 设置 Query Cache 中每次分配内存的最小值,即每个 Query 的 Cache 最小占用的内存空间大小。默认值为 4096(4KB)。
query_cache_size : 查询缓存占用大小,单位字节,默认值1048576(即1MB),注意配置时该参数必须是 1024 的整倍数。默认值比较小,会导致查询缓存存放的数据变少,建议调大。
query_cache_type : 查询使用查询缓存的方式,默认OFF(0)、不使用查询缓存。如果设置使用查询缓存则可设置为1(ON)。
query_cache_wlock_invalidate : 控制 MySQL 的查询缓存的锁有效性检查的机制。默认情况下,该参数的值为OFF,表示如果某个数据表被锁住,仍然从缓存中返回数据。建议保持默认值OFF。

5,查看查询缓存的状态变量:
show status like 'Qcache%';
show global status like '%Qcache%';

mysql> show global status like '%Qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 1031832  |
| Qcache_hits             | 0        |
| Qcache_inserts          | 0        |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 12710517 |
| Qcache_queries_in_cache | 0        |
| Qcache_total_blocks     | 1        |
+-------------------------+----------+

状态变量说明:
Qcache_free_blocks:查询缓存中的可用内存块数
Qcache_free_memory:查询缓存的可用内存
Qcache_hits:查询缓存命中数
Qcache_inserts:添加到查询缓存的查询数
Qcache_lowmen_prunes:由于内存不足而从查询缓存中删除的查询数
Qcache_not_cached:非缓存查询的数量(由于 query_cache_type 设置而无法缓存或未缓存的查询的数量)
Qcache_queries_in_cache:查询缓存中注册的查询数
Qcache_total_blocks:查询缓存中的块总数

6,SELECT 查询时显示指定查询缓存或不缓存:
例如:
SELECT SQL_CACHE id,info FROM test01;     -- 将查询结果放入缓存(前提缓存是开启的)
SELECT SQL_NO_CACHE id,info FROM test01;  -- 不缓存查询结果

注意:
1)只有 SELECT 查询语句才会缓存,但 SELECT 查询时,有些场景也不会走缓存;
2)MySQL Query Cache 内容为 SELECT 的结果集,Cache 使用完整的 SQL 字符串 HASH 做 key,区分大小写、空格、注释等,只要有任何一点存在差异,查询缓存就认为是不同的查询;
3)WHERE 条件中如包含任何一个不确定的函数将永远不会被 Cache,比如 current_date,now() 等;例如下面的 SQL 都不会被 Cache:
   select * from test where cdate < current_date;
   select * from test where cdate < current_date();
   select * from test where cdate < now();
4)MySQL的系统库表(mysql、information_schema等),不走查询缓存;
5)prepared statement 永远不会 cache 到结果,即使参数完全一样。在 MySQL 5.1 之后得到改善;
6)太大的 result set 不会被 Cache (< query_cache_limit);
7)MySQL Query Cache 在分库分表环境下是不起作用;
8)SQL 里有触发器,自定义函数时,也不起作用;
9)缓存的结果是通过 sessions 共享的,所以一个 client 查询的缓存结果,另一个 client 也可以使用;

缓存失效:
1)在表的结构或数据发生改变时,查询缓存中的数据不再有效。如 INSERT / UPDATE / DELETE / TRUNCATE / ALTER TABLE / DROP TABLE / DROP DATABASE 会导致缓存数据失效。所以查询缓存适合有大量相同查询(读)的应用,不适合有大量数据更新(写)的应用。
2)一旦表数据进行任何一行的修改,基于该表相关 Cache 立即全部失效。
因此:SELECT 语句都可以使用查询缓存,但是,涉及表上的 INSERT、UPDATE、DELETE、TRUNCATE 操作相比 SELECT 来说要非常少才行。

手动清理缓存:
FLUSH QUERY CACHE; -- 清理查询缓存内存碎片
RESET QUERY CACHE; -- 从查询缓存中移除所有查询
FLUSH TABLES;      -- 关闭所有打开的表,同时会清空查询缓存中的内容。谨慎使用。执行 FLUSH TABLES 的效果就是会等待所有正在运行的 SQL 请求结束(即使是 SELECT 查询),因为正在使用的表对象是不能关闭的(如果有 SQL 请求仍在运行),因此,FLUSH TABLES 操作会被正在运行的 SQL 请求阻塞,直到等所有执行的 SQL 请求结束。FLUSH TABLES 操作可认为是所有表的表级排他锁的效果。

你可能感兴趣的:(数据库,数据库,mysql,缓存)