🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 概述 QC 要求前后两次请求的 SQL 完全一样,不同数据库、不同协议版本或不同默认字符集的查询,都会被认为是不同的查询。甚至包括大小写, 比如下面两条 SQL ,查询缓存就会认为是两个不同的查询: ``` SELECT * FROM tbl_name Select * from tbl_name ``` **是否开启缓存** 1. 如果线上环境中 99% 以上都是只读,很少更新,可以考虑全局开启 QC,也就是设置 query_cache_type 为 1 2. 只缓存的是几张更新频率很低的表,其它表不考虑使用查询缓存,就可以考虑将 query_cache_type 设置成 2,这样就只缓存下面这类 SQL: ``` select sql_cache from hs_user; ``` 缺点: 1. 每次查询不一样,会额外增加开销 2. 需要前后两条 SQL 完全一样才能使用 3. 只要存在更新,就会清空这张表的查询缓存 ## 实例 ### 开启缓存 全局开启 QC ``` // my.cnf query_cache_type = 1 query_cache_size = 50M ``` 只开启部分表的 QC: ``` // my.cnf query_cache_type = 2 query_cache_size = 50M ``` 如果要开启 QC,建议不要设置过大,通常几十兆就好。如果设置过大,会增加维护缓存所需要的开销。 ### 是否开启缓存 ``` show variables like “%query_cache%”; ``` query_cache_type:缓存类型,有三个值可选: ``` 0 或者 off:关闭缓存 1 或者 on:打开缓存 2 或者 demand:只缓存带有 sql\_cache 的 select 语句。 ``` ### 监视查询缓存的使用情况 ![](https://img-blog.csdnimg.cn/20191028163208802.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMDI4MDA4,size_16,color_FFFFFF,t_70) ``` Qcache_free_blocks:查询缓存中的空闲内存块的数目 Qcache_free_memory:查询缓存的空闲内存总数 Qcache_hits:缓存命中次数 Qcache_inserts:被加入到缓存中的查询数目 Qcache_lowmem_prunes:因为缺少内存而从缓存中删除的查询数目 Qcache_not_cached:没有被缓存的查询数目 Qcache_queries_in_cache:在缓存中已注册的查询数目 Qcache_total_blocks:查询缓存中的块的总数目 ``` ### 清除查询缓存 ``` FLUSH QUERY CACHE; //清理查询缓存内存碎片 RESET QUERY CACHE; //从查询缓存中移出所有查询 FLUSH TABLES; //关闭所有打开的表,同时该操作将会清空查询缓存中的内容 ``` ### 关闭查询缓存 `SELECT SQL_NO_CACHE * form table_name`