MYSQL的Query Cache

        MySQL的Query Cache 就是用来缓存和 Query 相关的数据的。缓存客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中。


主要参数:

query_cache_limit:允许 Cache 的单条 Query 结果集的最大容量,默认是1MB,超过此值将不被 Cache
query_cache_min_res_unit:设置Query Cache中每次分配最小内存空间,即每个Cache占用的最小空间
query_cache_size:设置Query Cache所使用的最大内存,默认值为0,大小必须是1024的整数倍,MySQL 会自动调整降低最小量以达到1024的倍数
query_cache_type:控制Query Cache 的开关,可以设置为0(OFF),1(ON)和2(DEMAND)三种,意义分别如下:
   0(OFF):关闭 Query Cache 功能,任何情况下都不会使用 Query Cache
   1(ON):开启 Query Cache 功能,但是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后,将不使用Query Cache
   2(DEMAND):开启 Query Cache 功能,但是只有当 SELECT 语句中使用了 SQL_CACHE 提示后,才使用 Query Cache
query_cache_wlock_invalidate:控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache,如果设置为1(TRUE),则在写锁定时将失效该表相关的所有 Query Cache,如果设置为0(FALSE)则在锁定时仍然允许读取该表相关的 Query Cache


通过Global Status 查看Query Cache的状态:

   Qcache_free_blocks:目前还处于空闲状态的 Query Cache 中内存 Block 数目
   Qcache_free_memory:目前还处于空闲状态的 Query Cache 内存总量
   Qcache_hits:Query Cache 命中次数
   Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数
   Qcache_lowmem_prunes:当 Query Cache 内存容量不够,需要从中删除老的 Query Cache 以给新的
                                             Cache 对象使用的次数
   Qcache_not_cached:没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type
                                       设置的不会被 Cache 的 SQL
   Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 数量
   Qcache_total_blocks:Query Cache 中总的 Block 数量

       根据这几个状态可以计算出 Cache 命中率,计算出 Query Cache 大小设置是否足够。


关于Query Cache的一些说明:
1)以query请求为对象,无论是否包含多表查询或子查询,都只产生一个cache对象。但是存储方式是HASH结构的映射,所以需要sql语句字符大小写等一样,才能在下次查询时命中。


2)query cache中包含所需结果的结果集,客户端字符集,数据字符集,客户端连接的default database等

3)query cache的查找是在客户端权限验证之后,SQL解析之前,减少了语句分析与分析优化,不需要存储引擎的交互,减少了磁盘I/O与CPU运算。效率非常高。


4)为了保证 Query Cache 中的内容与是实际数据绝对一致,当表中的数据有任何变化,包括新增,修改,删除等,都会使所有引用到该表的 SQL 的 Query Cache 失效。


5)当query cache设置为 1 时,MySQL会对每个select 语句进行query cache查找,需要消耗资源。对于数据更新频繁的表,会不断失效,造成query cache命中低下,影响性能。


你可能感兴趣的:(mysql,cache,内存,query)