RDS for MySQL支持开启查询缓存,但需要根据具体的使用场景和需求进行设置,以下是关于RDS for MySQL查询缓存的详细解答:
功能和适用范围
1、降低CPU使用率:通过缓存重复的查询结果,减少CPU在解析和执行查询时的负担。
2、降低IOPS使用率:在某些情况下,缓存可以减少对磁盘的读写操作,从而降低IOPS(每秒输入/输出操作次数)的使用率。
3、减少查询响应时间:对于频繁执行的相同查询,可以直接从缓存中返回结果,而无需再次执行查询,从而减少响应时间。
4、提高系统吞吐量:通过减少每次查询的处理时间,可以提高系统整体的吞吐量。
5、适用范围:
表数据修改不频繁、数据较静态的场景。
查询(Select)重复度高的场景。
查询结果集小于1MB的场景。
原理
RDS for MySQL对来自客户端的查询(Select)进行Hash计算,得到该查询的Hash值,通过该Hash值到查询缓存中匹配该查询的结果,如果匹配成功(命中),则直接将查询的结果集返回给客户端,无需再解析和执行查询,如果没有匹配成功(未命中),则将Hash值和结果集保存在查询缓存中,以便以后使用,当查询涉及的任何一个表中的数据发生变化时,RDS for MySQL会将查询缓存中所有与该表相关的查询结果集全部释放(删除)。
限制
1、查询一致性要求:查询必须严格一致(包括大小写、空格、使用的数据库、协议版本、字符集等)才能命中缓存,否则视为不同查询。
2、不缓存子查询结果集:仅缓存查询的最终结果集,不缓存子查询的结果集。
3、不缓存特定类型的查询:如存储函数、存储过程、触发器、事件中的查询;含有每次执行结果变化的函数的查询(如now()、curdate()、last_insert_id()、rand()等);对mysql、information_schema、performance_schema系统数据库表的查询;使用临时表的查询;产生告警(Warnings)的查询;Select … lock in share mode、Select … for update、Select * from … where autoincrement_col is NULL类型的查询;使用用户定义变量的查询;使用Hint SQL_NO_CACHE的查询。
设置
1、参数设置:
query_cache_limit:查询缓存中可存放的单条查询最大结果集,默认为1MB;超过该大小的结果集不被缓存。
query_cache_size:查询缓存的大小,默认为3MB(但具体值可能因版本或配置而异)。
query_cache_type:是否开启查询缓存功能,取值为0表示关闭查询功能;取值为1表示开启查询缓存功能,但不缓存Select SQL_NO_CACHE开头的查询;取值为2表示开启查询缓存功能,但仅缓存Select SQL_CACHE开头的查询。
2、开启与关闭:
要开启查询缓存,需要设置query_cache_size大于0且query_cache_type设置为1或2。
要关闭查询缓存,可以设置query_cache_size为0或设置query_cache_type为0。
3、建议:
query_cache_size不建议设置过大,以免挤占实例其他内存结构的空间并增加在缓存中搜索的开销,建议根据实例规格,初始值设置为10MB到100MB之间的值,并根据运行使用情况调整。
通过调整query_cache_size的值来开启或关闭查询缓存,因为修改query_cache_type参数需要重启实例生效。
查询缓存适用于特定的场景,建议充分测试后再考虑开启,以避免引起性能下降或引入其他问题。
验证效果
可以通过执行以下SQL命令来获取查询缓存的使用状态:
show global status like 'Qca%';
这将返回一系列与查询缓存相关的信息,如Qcache_hits(查询缓存命中次数)、Qcache_inserts(将查询和结果集写入到查询缓存中的次数)、Qcache_not_cached(不可以缓存的查询次数)以及Qcache_queries_in_cache(查询缓存中缓存的查询量)。
RDS for MySQL确实支持开启查询缓存,但用户需要根据具体的应用场景和需求来谨慎设置和使用这一功能,在某些场景下,查询缓存可以带来性能上的提升;但在其他场景下,它可能会带来额外的资源消耗并降低SQL执行的性能,在决定是否开启查询缓存之前,建议进行充分的测试和评估。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1465357.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复