Mysql中高级特性 - 小抗在线
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,如果开启,阻止读取数据,有可能增加锁等待