zoukankan      html  css  js  c++  java
  • mysql基础之-mysql查询缓存(九)

    0x01

    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 | 16777216 |
    | 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(空闲块数) | 1 |
    | Qcache_free_memory(空闲空间) | 16759688 |
    | Qcache_hits(命中次数) | 0 |
    | Qcache_inserts(向缓存空间中插入的缓存的次数) | 0 |
    | Qcache_lowmem_prunes(内存太小,修剪内存的次数) | 0 |
    | Qcache_not_cached(没被缓存的个数) | 8 |
    | Qcache_queries_in_cache(缓存中缓存的查询个数) | 0 |
    | Qcache_total_blocks(总块数) | 1 |
    +-------------------------+----------+


    碎片整理 flush query_cache
    清空缓存 reset query_cache

    计算命中率:
    show global status where Vaiable_name='Qcache_hits' OR Variable_name='Com_Select';
    Qcache_hits/(Qcache_hits+Com_Select)

    也可以参考另外一个指标,命中和写入的比率,即Qcache_hits/Qcache_inserts的值,此比值如果能大于3:1.则表明缓存也是有效的,能达到10:1,为比较理想的情况

    缓存优化思路
    1.批量写入,而非多次单个写入
    2.缓存空间不宜过大,因为大量缓存同事失效时会导致服务器假死
    3.必要时,使用sql_CACHE和sql_no_cache手动控制缓存。
    4.对写密集型的应用场景来说,禁用缓存反而提高性能。

  • 相关阅读:
    spring cloud 学习
    python学习-2 python安装和环境变量的设置
    python学习-1 编程语言的介绍
    LIUNX随堂学习-3 权限
    LIUNX随堂学习-2 用户和组,增、删、改、查
    LIUNX随堂学习-1 用户及查看信息
    MySQL--Oracle导出数据csv
    MySQL--mysql中You can’t specify target table for update in FROM clause错误解决方法
    Python--安装
    MySQL--复制
  • 原文地址:https://www.cnblogs.com/autopwn/p/5119027.html
Copyright © 2011-2022 走看看