当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

Mysql中高级特性 - 小抗在线

作者:小梦 来源: 网络 时间: 2024-08-12 阅读:

mysql查询缓存

服务器根据缓存对相同的查询跳过解析和优化阶段,另一种缓存机制“查询缓存”,这种缓存保存了select 语句的完整结果集 ,查询缓存保留使用过的表,如果表发生了改变,那么缓存失效了,这种方式开销比较小,查询不会改变语义

  • mysql检查缓存命中

    mysql 不会对语句解析、正则化或者参数化,只要字符大小写,空格或者注释一点不同,查询缓存就认为是一个不同的查询
    查询缓存不会缓存引用用户自定义函数,存储函数,用户自定义变量,临时表
    查询缓存值针对服务器第一次收到的完整的select,所以查询里的子查询或视图也不能缓存,存储过程中的查询不能使用缓存

    mysql查询缓存可以改善性能,开启查询缓存对于读写都增加了某些额外的开销
    读取查询之前必须检查缓存
    如果查询可以被缓存,但是不再缓存中,那么产生结果之后进行保存会带来一些额外的开销
    写入数据的查询也会有额外的开销,因为必须使缓存中相关的数据表失效

    对于Innodb引擎,事务会限制查询缓存的失效,长期运行的事务增加查询缓存未命中的数量,如果缓存中有许多查询,缓存失效就会需要很长的时间并且延缓整个系统的工作。查询缓存有一个全局所,检查查询是否命中,以及查询失效时候都会发生访问动作

  • 缓存何时有帮助

    缓存不会自动比非缓存高效,缓存需要开销,当节省的资源大于开销,缓存才有真正的效率,和服务器负载有关
    缓存关闭时:读取操作执行查询语句返回给客户,写入操作需要执行查询
    缓存开启时:读取首先会检查查询缓存,要么执行返回结果,保存结果,再返回结果,每个写入操作需要执行查询语句

    并且检查是否缓存过的查询要失效

    查询结果可以减少产生结果的时间,不会减少结果发送到客户端的时间

  • 缓存未命中的原因

    查询不可以缓存:包含不确定函数(current_date),结果太大,无法缓存,状态qchache_not_cached 会因为这两种

    无法缓存的查询而增加
    服务器以前从来没有见过这个缓存
    查询的结果以前缓存过,服务器把它移除了

    服务器有很多缓存未命中,但是不能缓存的查询却很少
    查询缓存未激活,也就是服务器没有机会将结果存储到缓存中
    服务器看到未见过的查询
    有很多缓存失效

  • 如何对查询缓存进行维护和调优

    query_cache_type
    表示缓存是否激活,(off on demand) demand意思是只有包含sql_cache 的选项才能被缓存,即是会话级 变量也是全局性变量
    query_cache_size
    分配给查询的总内存,以字节为单位。必须是1024的倍数
    query_cache_min_res_unit
    分配缓存块的最小值,
    query_cache_limit
    限制mysql存储的最大结果,如果查询结果比这个值大,那么就不会被缓存,如果超过限制,mysql 自动增加 qcache_not_cached 值,可以优先给查询加上 sql_no_cache 避免这个开销
    query_cache_wlock_invalidate
    是否换取其他联接已经锁定的表,默认是off,如果开启,阻止读取数据,有可能增加锁等待

热点阅读

网友最爱