• MySQL查询缓存


                     MySQL查询缓存

                                            作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

     

    一.什么是MySQL查询缓存
      用于保存MySQL查询语句返回的完整结果,被命中时,MySQL会立即返回结果,省去解析、优化和执行等操作。把select语句本身做hash计算,计算的结果作为key,查询结果作为value,如果查询语句被缓存命中,就直接将value返回。
      查询语句中有一些不确定数据时,不会缓存;例如now(),current_time();一般来说,如果查询中包含用户自定义函数、存储函数、用户变量、临时表、mysql库中系统表、或者任何包含权限的表,一般都不会缓存。
     
    二.缓存会带来额外开销
      1>.每个查询都会先检查是否命中;
      2>.查询结果要先缓存;
      当服务器有多颗CPU时,且并发量的非常大时,这个时候我们就要考虑各个CPU挣夺缓存的内存空间的问题,也就是说当这种情况出现时,我们需要去衡量缓存的效率问题。当然你还要结合以上两点进行判断:
     
    三.查询缓存相关变量
     1 mysql> show global variables like 'query_cache%';
     2 +------------------------------+---------+
     3 | Variable_name                | Value   |
     4 +------------------------------+---------+
     5 | query_cache_limit            | 1048576 |
     6 | query_cache_min_res_unit     | 4096    |
     7 | query_cache_size             | 0       |
     8 | query_cache_type             | ON      |
     9 | query_cache_wlock_invalidate | OFF     |
    10 +------------------------------+---------+
    11 5 rows in set (0.00 sec)
    12 
    13 mysql> 
    14 
    15 1>.query_cache_type:
    16     查询缓存类型;是否开启缓存功能,开启方式有三种{ON|OFF|DEMAND},其中DEMAND意味着select语句明确使用sql_cache选项才会缓存哟。
    17 2>.query_cache_size:
    18     缓存使用的总空间。单位为字节,大小必须为1024的整数倍。mysql启动时,会一次分配并立即初始化这里指定大小的内存空间;这意味着,
    19 如果修改此大小,会清空所有缓存并重新初始化的。因此不建议修改此大小,最好是一开始就设计好,此内存不宜过大。
    20 3>.query_cache_min_res_unit:
    21     存储缓存的最小内存块 (query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache能够获得一个理想的值
    22 4>.query_cache_limit:
    23     单个缓存对象的最大值,超出时则不予缓存;手动使用SQL_NO_CACHE可以人为的避免尝试缓存返回超出此参数限定值得语句
    24 5>.query_cache_wlock_invalidate:
    25     如果某个表被其他用户连接锁住了,是否仍然从缓存中返回结果,OFF表示返回。 
     
    四.如何判断命中率
      MySQL查询缓存的命中率分为次数和字节命中率。状态变量是MySQL统计查询的结果,服务器变量是我们可以提前设定的值,可以提前定义它的工作属性,mysql状态变量是在工作时不断的统计数据的值(比如缓存命中的频率等等)。我们可以通过以下命令进行查询:
     1 mysql> show global status like 'Qcache%';
     2 +-------------------------+-------+
     3 | Variable_name           | Value |
     4 +-------------------------+-------+
     5 | Qcache_free_blocks      | 0     |
     6 | Qcache_free_memory      | 0     |
     7 | Qcache_hits             | 6     |
     8 | Qcache_inserts          | 0     |
     9 | Qcache_lowmem_prunes    | 0     |
    10 | Qcache_not_cached       | 0     |
    11 | Qcache_queries_in_cache | 0     |
    12 | Qcache_total_blocks     | 0     |
    13 +-------------------------+-------+
    14 8 rows in set (0.01 sec)
    15 
    16 mysql> 
    17 1>.Qcache_free_blocks          #指的是空闲块数,指的是系统分配给MySQL进程的缓存总大小空间中还没有使用的空间。
    18 2>.Qcache_hits                #指的是命中次数 
    19 3>.Qcache_inserts            #向缓存空间中插入的缓存的次数
    20 4>.Qcache_free_memory          #空闲空间,指的是还没有被操作系统分配出去的内存空间。
    21 5>.Qcache_lowmem_prunes        #内存太小,修剪内存的次数
    22 6>.Qcache_not_cached          #没被缓存的个数
    23 7>.Qcache_queries_in_cache     #缓存中缓存的查询个数
    24 8>.Qcache_total_blocks         #总块数,指的是系统分配给MySQL进程的缓存总大小空间
    25 9>.补充知识:
    26 a>.flush query_cache           #碎片整理
    27 b>.reset query_cache           #清空缓存
     
    五.计算命中率
     1 mysql> show global status where Variable_name='Qcache_hits' OR Variable_name='Com_Select';
     2 +---------------+-------+
     3 | Variable_name | Value |
     4 +---------------+-------+
     5 | Com_select    | 158   |
     6 | Qcache_hits   | 4    |
     7 +---------------+-------+
     8 2 rows in set (0.00 sec)
     9 
    10 mysql> 
    11 
    12 1>.总共查询了Com_select 次数,我们这里是158次;
    13 2>.缓存命中了Qcache_hits次数,我们这里是命中了4次;
    14   因此我们可以计算次数的命中率:   Qcache_hits/(Qcache_hits+Com_Select),当然这只是次数的命中率,我们想要查询字节的命中率的方法就很困难了。因此,也可以参考另外一个指标,命中和写入的比率,即Qcache_hits/Qcache_inserts的值,此比值如果能大于3:1.则表明缓存也是有效的,能达到10:1,为比较理想的情况。如果不能达到这个参数,建议是关闭缓存。
    六.缓存优化思路
      1>.批量写入,而非多次单个写入
      2>.缓存空间不宜过大,因为大量缓存同事失效时会导致服务器假死
      3>.必要时,使用sql_CACHE和sql_no_cache手动控制缓存。
      4>.对写密集型的应用场景来说,禁用缓存反而提高性能。
     
     
     
     
     
  • 相关阅读:
    [Linux]常用命令之【tar/zip/unzip/gzip/gunzip】
    [Git]解决: error: unable to create file src/main/webapp/xxxxxx/xxxx: Filename too long
    [Git]解决:error: The following untracked working tree files would be removed by checkout:
    [Linux]命令行分类
    [数据库/MYSQL]#解决缺陷#设置Unique索引时:"[Err] 1071
    [Java EE]辨析: POJO(PO / DTO / VO) | BO/DO | DAO
    [Java]遍历枚举类型为List
    【Vue】在Vue项目中调试Vue源码——修改Vue项目引入的vue文件
    【Vue】Vue源码解读之Component组件注册
    【Vue】驼峰命名法和短横线命名法的转换以及Vue源码中对驼峰式和大写式查找的支持
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/7898268.html
Copyright © 2020-2023  润新知