结果集缓存
本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
AnalyticDB for MySQL提供结果集缓存来减少不必要的计算,达到降低负载,加速查询的目的。本文介绍AnalyticDB for MySQL结果集缓存的限制和使用方式。
前提条件
AnalyticDB for MySQL集群的内核版本为3.2.0及以上版本。
功能说明
结果集缓存是指在AnalyticDB for MySQL接入层的本地存储空间中对首次查询的结果进行缓存,等再次提交相同的查询时,如果查询关联的库表数据没有更新,则从缓存的结果集中查询结果并反馈至客户端,不再重新计算。
适用场景
数据写入时段固定或集中。大部分时间数据保持不变, 无更新或写入。
查询存在一定重复率,即在一段时间内请求端发起多次相同查询。
注意事项
由于当前多主架构设计的限制,底层库表数据发生更新后,数据更新需要经过存储层同步到接入层,并在接入层内部节点间同步。因此数据更新信息的传递会有最多10秒的延迟, 导致结果集缓存不能保证强一致性, 但可以保证最终一致性, 即在数据更新10秒后, 相关缓存必定被淘汰, 再次缓存就是最新数据。
使用限制
满足以下所有条件的查询才能使用结果集缓存。
本次的查询语句在语法层面与之前被缓存的查询语句完全一致。
查询关联的表数据未发生过新增、删除或更新等变更。
查询未使用非确定性函数(Non-Deterministic Function),如NOW,CURRENT_TIMESTAMP等。
查询未使用外部数据源及内部系统表。
查询使用的表在黑白名单准入限制开启时符合对应的准入限制。
查询结果集大小未超过数据量的阈值(默认最多缓存10000行,超过设置的阈值,查询结果集会在生成过程中被撤销)。
开启结果集缓存
开启结果集缓存有以下两种方式:
通过Hint指定某一查询开启结果集缓存。
/*+result_cache=true*/ SELECT * FROM tpcds.catalog_returns WHERE cr_item_sk < 100;
通过修改集群级别配置项, 指定所有查询开启结果集缓存。
SET ADB_CONFIG RESULT_CACHE_APPLY_ALL=true;
警告开启集群级别会对所有请求尝试缓存结果集,在高并发场景下会增加负载。建议集群级别开启后, 再配置黑白名单准入限制来降低额外的缓存开销。详情请参见配置黑白名单准入限制。
黑白名单准入限制
在集群级别开启结果集缓存会对所有查询生效,会增加较多额外负载,而指定单个查询开启的方式又过于精细,会引入较多人为修改的成本。建议在集群级别开启结果集缓存时,通过黑白名单准入限制定义哪些表的查询使用结果集缓存。
SET ADB_CONFIG RESULT_CACHE_LIST_CONSTRAINT_MODE=[whitelist | blacklist | disable];
参数说明:
disable(默认值):不使用黑白名单准入限制。
whitelist:使用白名单准入限制。
blacklist:使用黑名单准入限制。
当开启黑白名单准入限制时,可以调整表级别的缓存属性RESULT_CACHE
来实现不同的缓存准入限制。
ALTER TABLE <table_name> RESULT_CACHE=[default | enable | disable];
当未开启黑名单或白名单准入限制时,则表缓存属性RESULT_CACHE无意义。符合使用限制的所有查询均可使用结果集缓存。
当开启黑名单准入限制时,表缓存属性名RESULT_CACHE设置为default或enable,包含该表的查询均允许使用结果集缓存。而值为disable时,包含该表的查询均不允许使用结果集缓存。
当开启白名单准入限制时,只有表缓存属性名RESULT_CACHE为enable,包含该表的查询才允许使用结果集缓存。而值为default或disable时,包含该表的查询均不允许使用结果集缓存。
您可以执行以下SQL语句查看配置了黑白名单准入的表。
SELECT * FROM INFORMATION_SCHEMA.RESULT_CACHE_LIST_CONSTRAINT;
结果集缓存大小限制
结果集缓存的数据量受到行数RESULT_CACHE_MAX_ROW_COUNT
的限制。若行数超过阈值,结果集将缓存失败。
配置结果集缓存的行数阈值。默认值为10000。
SET ADB_CONFIG RESULT_CACHE_MAX_ROW_COUNT = 10000;
查看所有结果集缓存
您可以执行以下SQL语句查看所有的结果集缓存数据。
SELECT * FROM INFORMATION_SCHEMA.RESULT_CACHE_STATUS;
结果集缓存淘汰策略
结果集缓存不需要您手动管理,AnalyticDB for MySQL会根据淘汰策略自动删除过期的结果集缓存。AnalyticDB for MySQL支持两种淘汰策略,超时淘汰和最大缓存数淘汰。满足任意一种淘汰策略,缓存就会被删除。
超时淘汰策略指超时未被访问的结果集缓存会被自动删除。超过时间由
RESULT_CACHE_EXPIRATION_TIME
指定。默认值为86400,单位为秒(s)。配置超时淘汰策略。
SET ADB_CONFIG RESULT_CACHE_EXPIRATION_TIME = 86400;
最大缓存数淘汰策略指在单个接入节点内超过最大缓存数,最久未被访问的缓存会被自动删除。单个接入节点最大缓存数由
RESULT_CACHE_MAX_CACHE_COUNT
指定。默认值为100。配置最大缓存数淘汰策略。
SET ADB_CONFIG RESULT_CACHE_MAX_CACHE_COUNT = 100;