mysql缓存机制

简介

  • mysql缓存机制就是缓存sql 文本及缓存结果,用KV形式保存再服务器内存中,如果运行相同的sql,服务器直接从缓存中去获取结果,不需要在再去解析、优化、执行sql。 如果这个表修改了,那么使用这个表中的所有缓存将不再有效,查询缓存值得相关条目将被清空。表中得任何改变是值表中任何数据或者是结构的改变,包括insert,update,delete,truncate,alter table,drop table或者是drop database 包括那些映射到改变了的表的使用merge表的查询,显然,者对于频繁更新的表,查询缓存不合适,对于一些不变的数据且有大量相同sql查询的表,查询缓存会节省很大的性能。

参数介绍

参数描述
Qcache_free_blocks1缓存中的空闲内存。
Qcache_free_memory20953968目前还处于空闲状态的Query Cache内存总量。
Qcache_hits4每次查询在缓存中命中时就增大。
Qcache_inserts2向Query Cache中插入新的Query Cache的次数,也就是没有命中的次数。
Qcache_lowmem_prunes0当Query Cache内存容量不够,需要从中删除老的Query Cache以给新的Cache对象使用的次数。
Qcache_not_cached21查询未被缓存次数,例如查询结果超出缓存块大小,查询中包含可变函数等。
Qcache_queries_in_cache0目前在Query Cache中的SQL数量。
Qcache_total_blocks1Query Cache中总的Block数量。
Qcache_lowmen_prunes因内存不足删除缓存次数
have_query_cacheYES
query_alloc_block_size8192缓存的块大小,默认为8192字节。
query_cache_limit1048576允许Cache的单条Query结果集的最大容量,默认是1MB,超过此参数设置的Query结果集将不会被Cache。
query_cache_min_res_unit4096设置Query Cache中每次分配内存的最小空间大小,也就是每个Query的Cache最小占用的内存空间大小。
query_cache_size20971520缓存空间大小,单位为字节,大小必须是1024的整数倍,如果不是整数倍,MySQL会自动调整降低最小量以达到1024的倍数。mysql启动时,会一次分配并立即初始化这里指定大小的内存空间;这意味着,如果修改此大小,会清空所有缓存并重新初始化的。因此不建议修改此大小,最好是一开始就设计好,此内存不宜过大。
query_cache_typeON查询缓存类型;是否开启缓存功能开启方式有三种{ON或1(开启),OFF或0(关闭),DEMAND或2(按需)},其中DEMAND意味着select语句明确使用sql_cache选项才会缓存哟
query_cache_wlock_invalidateOFF控制当有写锁加在表上的时候,是否先让该表相关的Query Cache失效,1(TRUE),在写锁定的同时将使该表相关的所有Query Cache 失效。0(FALSE),在锁定时刻仍然允许读取该表相关的Query Cache。

开启缓存

SET GLOBAL query_cache_type=ON
  • 或在mysql配置文件/etc/my.conf中的mysqld下添加或修改 query_cache_type=ON

注意修改后一定要重启才生效

service mysql restart

命中条件

  • 缓存存在一个hash表中,通过查询SQL,查询数据库,客户端协议等作为key,在判断命中前,mysql不会解析SQL,而是使用SQL去查询缓存,SQL上的任何字符的不同,如空格,注释,都会导致缓存不命中。如果查询有不确定的数据like now(),current_date(),那么查询完成后结果者不会被缓存,包含不确定的数的是不会放置到缓存中。

工作流程

  1. 服务器接收SQL,以SQL和一些其他条件为key查找缓存表
  2. 如果找到了缓存,则直接返回缓存
  3. 如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等。
  4. 执行完SQL查询结果以后,将SQL查询结果缓存入缓存表

缓存失败

  • 当某个表正在写入数据,则这个表的缓存(命中缓存,缓存写入等)将会处于失效状态,在Innodb中,如果某个事务修改了这张表,则这个表的缓存在事务提交前都会处于失效状态,在这个事务提交前,这个表的相关查询都无法被缓存。

缓存的内存管理

  • 缓存会在内存中开辟一块内存(query_cache_size)来维护缓存数据,其中大概有40K的空间是用来维护缓存数据的元数据的,例如空间内存,例如空间内存,数据表和查询结果映射,SQL和查询结果映射的。
    mysql将这个大内存块分为小内存块(query_cache_min_res_unit),每个小块中存储自身的类型、大小和查询结果数据,还有前后内存块的指针。
    mysql需要设置单个小存储块大小,在SQL查询开始(还未得到结果)时就去申请一块内存空间,所以即使你的缓存数据没有达到这个大小也需要这个大小的数据块去保存(like linux filesystem’s block)。如果超出这个内存块的大小,则需要再申请一个内存块。当查询完成发现申请的内存有富余,则会将富余的内存空间是放点,这就会造成内存碎片的问题
    在这里插入图片描述

缓存的使用时机

  • 衡量打开缓存是否对系统有性能提升是一个很难的话题
  1. 通过缓存命中率判断, 缓存命中率 = 缓存命中次数 (Qcache_hits) /查询次数 (Com_select)
  2. 通过缓存写入率, 写入率 = 缓存写入次数 (Qcache_inserts) /查询次数 (Qcache_inserts)
  3. 通过 命中-写入率 判断, 比率 = 命中次数 (Qcache_hits) / 写入次数 (Qcache_inserts), 高性能MySQL中称之为比较能反映性能提升的指数,一般来说达到3:1则算是查询缓存有效,而最好能够达到10:1

减少碎片策略

  1. 选择合适的block大小
  2. 使用 FLUSH QUERY CACHE 命令整理碎片.这个命令在整理缓存期间,会导致其他连接无法使用查询缓存
    PS: 清空缓存的命令式 RESET QUERY CACHE
    在这里插入图片描述

清理缓存

1FLUSH QUERY CACHE; // 清理查询缓存内存碎片。
2RESET QUERY CACHE; // 从查询缓存中移出所有查询。
3FLUSH TABLES; //关闭所有打开的表,同时该操作将会清空查询缓存中的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值