开启 mysql 缓存后,数据没有更新的情况下,相同的查询 sql 会使用缓存数据返回结果。

在数据更新较少,类似查询较多的情况下,使用 mysql 缓存可以显著提升查询效率。

1 查询缓存配置信息

show variables like ‘%query_cache%’;

MySQL 中查询缓存优化_sql

1 have_query_cache 表示是否支持查询缓存,YES 表示支持

2 query_cache_type 表示缓存类型,OFF 表示关闭查询缓存,ON 表示开启查询缓存,

DEMAND 表示用户自定义查询缓存

3 query_cache_limit 1表示支持的最大单条查询 sql 数据量

4 query_cache_min_res_unit 表示查询缓存最小单位

5 query_cache_size 表示查询缓存空间大小

6 query_cache_wlock_invalidate 表示查询缓存是否支持写锁,OFF 表示不支持,即读

取数据不考虑写锁,ON 表示支持,即读取数据会被写锁阻塞

2 开启查询缓存

查看当前的 MySQL 数据库是否支持查询缓存

show variables like ‘have_query_cache’;

MySQL 中查询缓存优化_缓存_02

查看当前 MySQL 是否开启了查询缓存

show variables like ‘query_cache_type’;

MySQL 中查询缓存优化_sql_03

在 Mysql 配置文件文件中开启查询缓存

1 query_cache_type=0(OFF)关闭

2 query_cache_type=1(ON)缓存所有结果,除非 select 语句使用 SQL_NO_CACHE 禁用

查询缓存

3 query_cache_type=2(DEMAND),只缓存 select 语句中通过 SQL_CACHE 指定需要缓

存的查询

配置查询缓存的占用空间单位 M

query_cache_size=10M

3 查询缓存使用

只有字符串相等查询的 sql 才使用相同缓存,即 select name from users 与 SELECT name

FROM users 不使用同一个缓存。

在 query_cache_type 为 ON 的情况下,默认所有查询都使用缓存,我们可以使用

sql_no_cache 显示指定某个查询不使用缓存 select sql_no_cache name from users;

在 query_cache_type 为 DEMAND 的情况下,需要使用 sql_cache 指定某个查询使用缓存

select sql_cache name from users;

show status like ‘Qcache%’;

MySQL 中查询缓存优化_sql_04

1 Qcache_free_blocks 表示已分配内存块中空闲块数量;

2 Qcache_total_blocks 表示当前查询缓存占用的内存块数量;

3 Qcache_free_memory 表示缓存空闲空间大小;

4 Qcache_hits 表示缓存命次数;

5 Qcache_inserts 表示缓存未命中时,数据写入缓存次数;

6 Qcache_queries_in_cache 表示缓存查询语句数量;

7 Qcache_lowmem_prunes 表示缓存修剪次数,缓存满时,会使用 LRU 算法移除最久

未被使用缓存,此值较大,说明缓存空间太小;

8 Qcache_not_cached 表示没有被缓存的查询 sql 数量;

4 查询缓存失效的情况

SQL 语句不一致的情况,要想命中查询缓存,查询的 SQL 语句必须一致。

SQL1 : select count(*) from users;

SQL2 : Select count(*) from users;

当查询语句中有一些不确定的操作时,则不会缓存。如 : now() , current_date() ,

curdate() , curtime() , rand() ,uuid() , user() , database() 。

SQL1 : select * from tb_item where updatetime < now() limit 1;

SQL2 : select user();

SQL3 : select database();

不使用任何表查询语句。

select ‘a’

查询 mysql,information_schema 或 performance_schema 数据库中的表时,不会走查

询缓存。

select * from information_schema.engines;

在存储的函数,触发器或事件的主体内执行的查询。

如果表更改,则使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除。这包

括使用 MERGE 映射到已更改表的表的查询。一个表可以被许多类型的语句,如被改变

INSERT, UPDATE, DELETE, TRUNCATE TABLE, ALTER TABLE, DROP TABLE,或 DROP

DATABASE