Mysql查询缓存Query_cache的功用
MySQL的查询缓存并非缓存执行计划,而是查询及其结果集,这就意味着只有相同的查询操作才能命中缓存,因此MySQL的查询缓存命中率很低,另一方面,对于大结果集的查询,其查询结果可以从cache中直接读取,有效的提升了查询效率。
那么如何设置缓存的大小呢?来看一下:
1、在mysql客户端命令行中我们可以这么查看缓存是否开启以及缓存设置的大小:
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 | 16106127360 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+-------------+ 6 rows in set (0.01 sec)
其中:
query_cache_type: 是否开启缓存功能,取值为ON, OFF, DEMAND,默认值为ON
- 值为OFF或0时,查询缓存功能关闭;
- 值为ON或1时,查询缓存功能打开,SELECT的结果符合缓存条件即会缓存,否则,不予缓存,显式指定SQL_NO_CACHE,不予缓存;
- 值为DEMAND或2时,查询缓存功能按需进行,显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存
query_cache_wlock_invalidate:表示当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。
query_cache_limit 指定单个查询能够使用的缓冲区大小,缺省为1M;
query_cache_min_res_unit为系统分配的最小缓存块大小,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费;query_cache_size:表示缓存的大小。
了解了以上的指标后我们就可以在mysql的配置文件my.cnf中进行设置。然后重启mysl服务器即可。在[mysqld]下面添加参数。一般是设置query_cache_size和query_cache_type两项。
2、上面查看的是我们进行缓存的配置,它一般从配置文件中读取值,但是有时候我们需要实时查看当前mysql中的数据缓存大小。
mysql> show 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 | 16489053 | | Qcache_queries_in_cache | 0 | | Qcache_total_blocks | 1 | +-------------------------+----------+ 8 rows in set (0.00 sec)
解释:
Qcache_free_memory:缓存中的空闲内存。
Qcache_total_blocks:缓存中块的数量。
Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个 数字在不断增长,就表示可能碎片非常严重,或者内存很少。如何确定就需要查看Qcache_free_blocks和Qcache_free_memory 两项指标。
3、清空缓存:
flush query cache命令
加大缓存有助于我们查询的效率提高:
这里举个例子:
mysql> use mob_adn Database changed mysql> select count(*) from creative_output; +----------+ | count(*) | +----------+ | 87151154 | +----------+ 1 row in set (3 min 18.29 sec) mysql> select count(*) from creative_output; +----------+ | count(*) | +----------+ | 87151154 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from creative_output; +----------+ | count(*) | +----------+ | 87151154 | +----------+ 1 row in set (0.00 sec)
可以看到缓存真的很厉害。
还有的同学会想到innodb_buffer_pool这个参数,两者的作用与区别我会接着来讲。
顺便这里在讲解一下SQL几项优化(很好):
https://www.cnblogs.com/L-dongf/p/9163848.html
相关文章
- Mysql加锁过程详解(3)-关于mysql 幻读理解
- linux mysql 操作大全
- Mysql net start mysql启动,提示发生系统错误 5 拒绝訪问 解决之道
- MySQL与MongoDB的操作对比,以及区别
- 【mysql+pandas】用MySQL命令处理在python中处理DataFrame数据 pandasql库
- 【MySQL】MySQL的优化(三)
- MySQL数据库与Redis缓存双写一致性
- 关于Mysql 查询所有表的实时记录用于对比2个MySQL 库的数据是否异步
- MYSQL批量修改表前缀与表名sql语句
- mysql主从数据库复制
- 【MySQL进阶-10】mysql语句的执行流程以及集群的高可用
- mysql数据库提示本地无法连接远程服务器(Host is not allowed to connect to this MySQL server)解决办法
- Mysql主从复制(重置版)
- 基于JSP+MySQL 实现(Web)毕业设计题目收集系统【100010330】
- MySQL关闭查询缓存(QC)的两种方法
- linux 防止误操作 mysql 数据库技巧
- ubuntu16.04系统彻底卸载mysql,并源码免编译重装MySQL的步骤
- MySQL核心之双一原则
- mysql远程连接 Host is not allowed to connect to this MySQL server
- mysql插入多行数据
- mysql双主架构解决自增冲突
- mysql区分大小写问题
- Mysql error.log报错:Error: Table “mysql”.“innodb_table_stats” not found
- (5.6)mysql高可用系列——MySQL Utilities 管理工具
- 【转】MySQL查询缓存详解
- MYSQL中使用SHOW PROFILE命令分析性能的用法整理
- MySQL数据库启停
- MySQL中的排序(ORDER BY)
- [Mysql] 插入数据