首先提一下查询缓存
在解析一个查询语句前,如果查询缓存是打开的,而且查询语句是命中查询缓存中的数据。在检查一次用户权限后直接返回缓存中的结果。这种情况下,查询不会被解析,也不会生成执行计划,更不会执行。
开启缓存也会带来开销,主要表现在以下几个方面:
-
任何的查询语句在开始之前都必须经过检查,即使这条SQL语句永远不会命中缓存
-
如果查询结果可以被缓存,那么执行完成后,会将结果存入缓存,也会带来额外的系统消耗
有的情况查询缓存不会被缓存,即使你使用 SQL_CACHE也不能缓存
主要为以下几种:
- 引用了用户自定义函数
- 引用了用户自定义变量
- 以用了存续过程
- 查询中包含一些实时的系统函数,比如now
- 引用了临时表
虽然上面说到缓存会带来一些开销,但是缓存对mysql还是很重要,带来的好处比坏处多。
那么mysql缓存是如何使用内存的?
查询缓存的内存池被分为大小可变的块,每一个快都知道自己的大小,指向前一个和后一个逻辑块和物理块 的指针,服务器启动时初始化查询缓存使用的物理内存,内存池开始会设置一个块,它的大小为被配置为缓存的大小减去自身需要的40KB大小。在每次缓存查询结果时,会为查询结果分配一个缓存块,但是服务器无法估计需要缓存的结果的大小,至少会大于等于query_cache_min_res_unit,,服务器在分配时,不会再缓存中一次生成最终结果然后缓存发送到客户端,而是产生一条缓存一条