首先提一下查询缓存
在解析一个查询语句前,如果查询缓存是打开的,而且查询语句是命中查询缓存中的数据。在检查一次用户权限后直接返回缓存中的结果。这种情况下,查询不会被解析,也不会生成执行计划,更不会执行。
开启缓存也会带来开销,主要表现在以下几个方面:
-
任何的查询语句在开始之前都必须经过检查,即使这条SQL语句永远不会命中缓存
-
如果查询结果可以被缓存,那么执行完成后,会将结果存入缓存,也会带来额外的系统消耗
有的情况查询缓存不会被缓存,即使你使用 SQL_CACHE也不能缓存
主要为以下几种:
- 引用了用户自定义函数
- 引用了用户自定义变量
- 以用了存续过程
- 查询中包含一些实时的系统函数,比如now
- 引用了临时表
虽然上面说到缓存会带来一些开销,但是缓存对mysql还是很重要,带来的好处比坏处多。
那么mysql缓存是如何使用内存的?
查询缓存的内存池被分为大小可变的块,每一个快都知道自己的大小,指向前一个和后一个逻辑块和物理块 的指针,服务器启动时初始化查询缓存使用的物理内存,内存池开始会设置一个块,它的大小为被配置为缓存的大小减去自身需要的40KB大小。在每次缓存查询结果时,会为查询结果分配一个缓存块,但是服务器无法估计需要缓存的结果的大小,至少会大于等于query_cache_min_res_unit,,服务器在分配时,不会再缓存中一次生成最终结果然后缓存发送到客户端,而是产生一条缓存一条,这样缓存就能保证空间不会在分配时浪费或者不足。分配内存块的速度较慢,因为服务器需要检查可用内存列表并且找打大小合适的快,因此服务器会尽量减少分配次数,当需要缓存结果时,他会构建一个大小至少为最小值的块,并且把结果放在块中,如果块已经满了,但是数据没有完整保存,那么就会产生一个新块并且保存数据,在数据存完后,如果数据块还有空隙,服务器就会剪辑数据块,并且把空间并入剩余的空间中,在其中可能产生碎片。通过紧缩,可以讲碎片空间并入有效的数据空间中。
对于事物引擎,比如innodb,事物会影响缓存,因为脏数据也会让其他引用了这块数据的缓存失效。直到该事物提交或回滚之后,这块数据才会被缓存。
query_cache_min_res_unit:the minimum size (in bytes) for blocks allocated by the query cache. The default value is 4096 (4KB)
来源:CSDN
作者:CSDN砖家
链接:https://blog.csdn.net/weixin_40205234/article/details/103237033