今天在工作中无意发现数据监控里不同的数据库qcache_hits,数据不一样。
A数据库
B数据库
从上图可以看到量数据库一个有qcache,一个没有qcache,这让我有点迷茫,没有qcache的A数据库是线上的核心业务库,承载的量比较大。B数据库作为曾经是核心数据库,现在业务已经逐渐过渡到A数据库,现在仅存一些杂七杂八的业务在上面。作为业务从A数据迁移至B数据库的全称负责人员,并没有发现线上业务因为qcache的不同而受到影响。反而性能比以前提升了不少。(具体数据就不列出了)
那就不得不去研究一下 qcache。
什么是qcache?
MYSQL 查询缓存,缓存保存查询返回的完整结果。当查询命中缓存立即返回结果,跳过了解析、优化和执行的阶段。
这句话什么意思呢?就是那个查询的sql用哈希生成一个缓存key,将结果直接缓存起来,sql 中任意字符的改变,哪怕是加一个空格都会导致缓存失效。
当查询中有一些不能确定的数据时,则不会被缓存。例如包含NOW()或者CURRENT_DATE()的查询不会被缓存。
所以查询中包含一个不确定函数,MYSQL则不会查询缓存。这句换是错误的。
好了基本的概念我们了解了,现在去看看具体这两个库的具体设置。
A数据库
A数据库 B数据库 B数据库
SHOW VARIABLES LIKE '%query_cache%'; 查看缓存设置
这里有个迷惑人的配置,have_query_cache. 查文档得知
YES
if mysqld supports the query cache, NO
if not.
意思可以简单理解为,系统是否支持查询缓存。所以这个参数不是开启或者关闭qcache的参数。
这两个参数才是
query_cache_size
query_cache_type
Property | Value |
---|---|
Command-Line Format | --query-cache-size=# |
Deprecated | 5.7.20 |
System Variable | [query_cache_size](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_query_cache_size) |
Scope | Global |
Dynamic | Yes |
Type | Integer |
Default Value | 1048576 |
Minimum Value | 0 |
Maximum Value (64-bit platforms) | 18446744073709551615 |
Maximum Value (32-bit platforms) | 4294967295 |
The amount of memory allocated for caching query results. By default, the query cache is disabled. This is achieved using a default value of 1M, with a default forquery_cache_type
of 0. (To reduce overhead significantly if you set the size to 0, you should also start the server with query_cache_type=0
.
从A库和B库的配置可以看出A库是关闭了缓存而B库开启了缓存。
那我们来看一下缓存是否减少了慢查询呢?
A库慢查询 B库慢查询
可以看出来慢查询的对比不在一个数量级上。从这个角度来看DB的性能受到了慢查询的影响。而qcache在我的业务场景下,没有显著的性能优势。Db的主要优化还要放在慢查询上啊。
qcache和我们业务中所使用的缓存有许多不一样的地方,单纯的开启qcache并不能提升性能,有时性能还会受其所累。
那么具体我们应该怎么使用qcache,或者怎么去设置呢?感兴趣的读者可以留言给我,如果有人想看的话,我会写下一篇文章讲解一下我的理解。
网友评论