MySQL查询缓存

       用于保存MySQL查询语句返回的完整结果,被命中时,MySQL会即返回结果,省去分析、优化和执行等阶段。

       如何检查缓存?
              MySQL保存数据于缓存中:
                     把SELECT语句做hash计算,计算的结果作为key,查询结果作为value

       什么样的语句不会被缓存?
                    查询语句中有一些不确定数据时,不会缓存:例如NOW(),CURRENT_TIME()
                    :一般来说,如果查询语句中包含用户自定义函数、存储函数、用户变量、临时表、mysql库中系统表、或者任何包含权限的表,一般都不会缓存;
           
       缓存会带来额外开销:
           1、每个查询都得先检查是否命中:
           2、查询结果要先缓存:
           
           mysql> SHOW GLOBAL VARIABLES LIKE 'query_cache%';
             +------------------------------+---------+
             | Variable_name                | Value   |
             +------------------------------+---------+
             | query_cache_limit            | 1048576 |
             | query_cache_min_res_unit     | 4096    |
             | query_cache_size             | 0       |
             | query_cache_type             | ON      |
             | query_cache_wlock_invalidate | OFF     |
             +------------------------------+---------+
 
             query_cache_type:查询缓存类型:是否开启缓存功能,开启方式有三种{ON|OFF|DEMAND}
                       DEMAND:意味着SELECT语句明确使用SQL_CACHE选项时才会缓存:

             query_cache_size:总空间,单位为字节,大小必须是1024的整数倍。MySQL启动时,会一次分配并立即初始化这里指定大小的内存空间:这意味着,如果修改此大小,会清空缓存并重新初始化的。

              query_cache_min_res_unit:存储缓存的最小内存块:(query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache能够获得一个理想的值

              query_cache_limit:单个缓存对象的最大值,超出时则不予缓存:手动使用SQL_NO_CACHE可以认为地避免尝试返回结果超出此参数限定值的语句。

              query_cache_wlock_invalidate:如果某个表被其它用户连接锁住了,是否仍然从缓存中返回结果,OFF表示返回。
     
       如何判断命中率:
                   mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';
                   +-------------------------+-------+
                    | Variable_name           | Value |
                   +-------------------------+-------+
                   | Qcache_free_blocks      | 0     |
                   | Qcache_free_memory      | 0     |
                   | Qcache_hits             | 0     |
                   | Qcache_inserts          | 0     |
                   | Qcache_lowmem_prunes    | 0     |
                   | Qcache_not_cached       | 0     |
                   | Qcache_queries_in_cache | 0     |
                   | Qcache_total_blocks     | 0     |
                   +-------------------------+-------+
                
                  碎片整理: FLUSH QUERY_CACHE
                  清空缓存: RESET QUERY_CACHE
                 
                计算命中率:
                  mysql> SHOW GLOBAL STATUS WHERE Variable_name='Qcache_hits'  OR  Variable_name='Com_select';
                  +---------------+-------+
                  | Variable_name | Value |
                  +---------------+-------+
                  | Com_select    | 8     |
                  | Qcache_hits   | 0     |
                 +---------------+-------+
                 
                  Qcache_hits/( Com_select+Qcache_hits)                
              
                  也应该参考另外一个指标:命中和写入的比率,即Qcache_hits/
                  Qcache_inserts的值,此比值如果能大于3:1,则表明缓存也是有效的。能达到10:1,为比较理想的情况

            缓存优化使用思路:
                  1、批量写入而非多次单个写入:
                  2、缓存空间不宜过大,因为大量缓存同时失效时会导致服务器假死:
                  3、必要时,使用SQL_CACHE和SQL_NO_CACHE手动控制缓存:
                  4、对写密集型的应用场景来说,禁用缓存能提高性能:
                 
                        
1、查询与缓存相关的变量
mysql> SHOW GLOBAL VARIABLES LIKE 'query_cache%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096    |
| query_cache_size             | 0       |
| query_cache_type             | ON      |
| query_cache_wlock_invalidate | OFF     |
+------------------------------+---------+
5 rows in set (0.01 sec)

2、查询mysql工作时缓存命中的几个参数
mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Qcache_free_blocks      | 0     |
| Qcache_free_memory      | 0     |
| Qcache_hits             | 0     |
| Qcache_inserts          | 0     |
| Qcache_lowmem_prunes    | 0     |
| Qcache_not_cached       | 0     |
| Qcache_queries_in_cache | 0     |
| Qcache_total_blocks     | 0     |
+-------------------------+-------+
8 rows in set (0.01 sec)

3、查看查询次数和命中次数
mysql> SHOW GLOBAL STATUS WHERE Variable_name='Qcache_hits' OR Variable_name='Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 8     |
| Qcache_hits   | 0     |
+---------------+-------+
2 rows in set (0.00 sec)













09-22 00:21