美文网首页
查询缓存

查询缓存

作者: 咸鱼佬 | 来源:发表于2018-10-14 09:22 被阅读35次

    概述

    缓存机制简单地说就是缓存SQL 语句和查询结果,如果运行相同的sql 语句,服务器会直接从缓存中取到结果,而不需要再去解析执行sql语句。查询缓存会存储最新数据,而不会返回过期数据,当数据被修改后,在查询缓存中的任何相关数据都会清除,对于频繁更新的表,查询缓存是不适合的,而对于一些不经常改变数据且大量相同sql 查询的表,查询缓存会提高很大的性能

    认识查询缓存

    have_query_cache YES
    query_cache_limit 1048576
    query_cache_min_res_unit 4096
    query_cache_size 1048576
    query_cache_type OFF
    query_cache_wlock_invalidate OFF

    1. have_query_cache 用来设置是否支持查询缓存区,yes 表示支持查询缓存区
    2. query_cache_limit 用来设置mysql可以缓存的最大结果集,大于此值得结果集不被缓存,该参数默认值是 1MB
    3. query_cache_min_res_unit 用来设置分配内存块的最小体积。每次给查询缓存结果分配的内存的大小,默认分配4096字节,如果此值比较小,那么回节省内存,但是这样会让系统频繁分配内存块
    4. query_cache_size 用来设置查询缓存使用的总内存字节数,必须是1024字节的倍数
    5. query_cache_type 用来设置是否启用查询缓存,,如果是OFF表示不进行缓存,如果设置为On 表示除了SQL_NO_CACHE 的查询外,缓存所用的结果,如果设置为DEMAND
    6. query_cache_wlock_invalidate 用来设置是否允许在其他连接处于lock状态时,使用缓存结果,默认是OFF,不会影响大部分应用。在默认情况下,一个查询中使用的表即使被Lock tables 命令锁住了,查询也能被缓存下来

    查询缓存命中次数

    show status like 'Qcache_hits'

    监控和维护查询缓存

    flush query cache
    该命令用于整理查询缓存,以便更好地利用查询缓存的内存,这个命令不会从缓存中移除任何的查询结果
    reset query cache
    用于移除查询缓存中所有的查询结果

    show status like 'Qcache%'

    Qcache_free_blocks 1 缓存中空余的内存块
    Qcache_free_memory 1029312 缓存中剩余的内存大小
    Qcache_hits 2 缓存命中总次数
    Qcache_inserts 2 被加入到缓存中的查询数目
    Qcache_lowmem_prunes 0 因内存不足而被删除的查询数目
    Qcache_not_cached 38 没有被缓存的查询数目
    Qcache_queries_in_cache 2 在缓存中已经注册的查询数目
    Qcache_total_blocks 6 缓存中总的内存块数目

    提高缓存命中率

    1. 客户端的字符集和服务器端的字符集一致,即使客户端没有出现乱码的情况,查询数据可能因为字符集不同而没有被数据库缓存起来
    2. 客户端和服务器采用一致的SQL语句,虽然对于数据库而言,SQL是不区分大小写的,但是对于缓存而已会被当作不一样的查询语句
    3. 查询缓存不会存储不确定的查询,比如包含不确定函数(NOW()),同样的,current_user() connection_id() 这些由不同用户执行,将会产生不同结果的查询也不会被缓存,而且查询缓存也不会缓存用户自定义函数,自定义变量,临时表的查询
    4. 通过分区表提高命中率

    缓存的弊端:

    1. mysql 服务器在进行查询之前会先检查查询缓存是否存在相同的查询条目
    2. mysql服务器在进行查询操作时,如果缓存中没有相同的查询条目,将会将查询结果缓存,这个过程也需要系统资源
    3. 如果数据库表发生增加操作,mysql 会查询对应的缓存中失效的查询结果,这样也需要系统资源

    相关文章

      网友评论

          本文标题:查询缓存

          本文链接:https://www.haomeiwen.com/subject/xmhzaftx.html