ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Mysql 的查询缓存参数介绍与优化思路

2022-08-26 19:30:09  阅读:193  来源: 互联网

标签:hits 缓存 Mysql Qcache 查询 cache mysql


以下内容都是来自马哥的分享,虽然都是收费的,但是值得一看(我绝不是拖啊!),涉及到的数据都是服务器的真实数据,可以自己做个计算还是挺有趣的!
查询缓存的参数说明(my.cnf)
mysql> show global variables like "query_cache%";

Variable_name Value desc
query_cache_limit 1048576 Mysql允许缓存的单个缓存对象的最大值,不过mysql只有在查询的所有结果都返回后才知道其是否超出此大小,但是在查询一开始便会尝试使用缓存存储查询结果,一旦发现超过可缓存最大值则会从缓存中将其删除,并增大Qcache_not_cached的值,因此,如果知道某查询的结果会超出可缓存的最大值的时候,应该在查询语句中使用SQL_NO_CACHE
query_cache_min_res_unit 4096 存储缓存的最小内存块,这个值过小,会减少空间浪费,但是会导致更频繁的内存块申请操作,设置的过大,会有着更高的碎片产生率,可以通过(query_cache_size - Qcache_free_memory) / Qcache_queryer_in_cache 来获得一个接近理想的值,同时,如果Qcache_free_blocks存在空闲块,但是Qcache_lowmem_prunes的值仍然在增长,则表明碎片过多导致了缓存结果会过早删除
query_cache_size 33554432 查询缓存的内存总大小,其必须是1024的整数倍,单位为字节。Mysql启动时,一次性分配并且初始化这里指定大小的内存空间,改变其值,mysql会立刻删除所有的缓存对象并重新配置其大小及初始化,在性能较强的通用服务器上,查询缓存可能会成为影响服务器扩展的因素,因为它存在成为服务器资源竞争单点的可能性,在多核心的服务器上甚至还有可能导致服务进程宕机
query_cache_type ON 是否打开查询缓存,其可用值有OFF,ON和DEMAND,DEMAND仅在查询语句中显式使用SQL_CACHE时才会使用缓存
query_cache_wlock_invalidate OFF 如果某个数据表被其它的链接锁住,是否仍然从查询缓存中返回结果。OFF表示返回
MySql运行产生的状态值
mysql> show global status like 'qcache%';

Variable_name Value desc
Qcache_free_blocks 1057 已经分配了块,但是尚未存储数据 , 如果该值显示较大,则说明Query Cache 中的内存碎片较多了,可能需要寻找合适的机会进行整理。
Qcache_free_memory 21667632 没有被申请划分为数据块的部分
Qcache_hits 2379301 缓存命中次数
Qcache_inserts 412811 执行向缓存中插入缓存对象的次数
Qcache_lowmem_prunes 0 因为内存太小不能继续存储的对象个数, 如果Qcache_lowmem_prunes 值比较大,表示查询缓存区大小设置太小,需要增大。
Qcache_not_cached 1248823 查询没被缓存的个数
Qcache_queries_in_cache 1804 保存在缓存中的查询个数
Qcache_total_blocks 5043 已经分配好的块个数
如何确定MySql中是否缓存了刚才执行的SQL语句
mysql中的缓存是 key-value hash hash区分大小写

MySql那些东西不会被缓存
不确定性的内容
用户自定义函数
用户自定义变量
临时表
mysql用的系统表
列级别的权限
存储函数
不确定数据
命中率估算
mysql> show global status where variable_name="Qcache_hits" or variable_name="Com_select";

Variable_name Value
Com_select 1703848
Qcache_hits 2421498
1. hits rate(命中率) = Qcache_hits/(Qcache_hits+Com_select)不过。这个未必能反应真实情况! 命中率>30%就可以认为有效
2. 也应该经常查询另一个指标,命中和写入的比率,即Qcache_hits和Qcache_insert的比值,次比例大于3:1时通常查询缓存是有效的,能达到甚至大于10:1就更好了。

缓存整理操作
FLUSH QUERY_CACHE, 命令可以用于完成碎片整理,但会导致服务器系统僵死一段时间
要清空缓存,可以使用RESET QUERY_CACHE
通用缓存优化思路
批量写入而非单个写入,批量写入仅一次性影响缓存
过大的缓存空间会使的在大量缓存对象过期失效时导致服务器假死
必要时,使用SQL_CACHE和SQL_NO_CACHE手动控制缓存动作。
对写密集型的场景来说,禁用缓存可以提高性能。
如果Qcache_lowmem_prunes 值比较大,表示查询缓存区大小设置太小,需要增大。
————————————————
版权声明:本文为CSDN博主「coder_up」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wjc19911118/article/details/51463519

标签:hits,缓存,Mysql,Qcache,查询,cache,mysql
来源: https://www.cnblogs.com/jmbt/p/16628943.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有