AnalyticDB MySQL版提供结果集缓存来减少不必要的计算,达到降低负载,加速查询的目的。本文介绍AnalyticDB MySQL版结果集缓存的限制和使用方式。
功能说明
结果集缓存是指在AnalyticDB MySQL接入层的本地存储空间中对首次查询的结果进行缓存,等再次提交相同的查询时,如果查询关联的库表数据没有更新,则从缓存的结果集中查询结果并反馈至客户端,不再重新计算。
适用场景
- 数据写入时段固定,或数据写入时间点集中。例如每天凌晨2点~5点有批量写入,或每间隔半小时有一批实时写入等。
- 查询存在一定重复率,即在一段时间内发生多次相同查询。
前提条件
注意事项
由于当前多主架构设计的限制,底层库表数据发生更新后,数据更新需要经过存储层同步到接入层,并在接入层内部节点间同步。因此数据更新会有5~10秒的延迟,导致缓存无法强一致,但能保证结果最终一致。
使用限制
满足以下所有条件的查询才能使用结果集缓存。
- 本次的查询语句在语法层面与之前被缓存的查询语句完全一致。
- 查询关联的表数据未发生过新增、删除或更新等变更。
- 查询未使用非确定性函数(Non-Deterministic Function),如NOW,CURRENT_TIMESTAMP等。
- 查询未使用外部数据源及内部系统表。
- 查询结果集大小未超过数据量的阈值(默认RESULT_CACHE_MAX_ROW_COUNT和RESULT_CACHE_MAX_BYTE_SIZE分别为10000行和16 MB),超过设置的阈值,查询结果集会在生成过程中被撤销。
开启结果集缓存
结果集缓存功能默认为关闭。如果需要使用结果集缓存功能,您可以开启结果集缓存。
SET ADB_CONFIG RESULT_CACHE_ENABLE=true;
使用结果集缓存
开启结果集缓存后,您还需要指定单个查询或所有查询使用结果集缓存。否则,无法使用结果集缓存。
- 单个查询使用结果集缓存。
/*+result_cache=true*/ SELECT * FROM <user_db.user_table> WHERE index < 100 ORDER BY score;
- 所有查询使用结果集缓存。
SET ADB_CONFIG RESULT_CACHE_ALL=true;
说明 您也可以配置黑白名单策略,实现不同的缓存准入限制。详情请参见配置黑白名单。
查看所有结果集缓存
您可以执行以下SQL语句查看所有的结果集缓存数据。
SELECT * FROM RESULT_CACHE_STATUS_MERGED;
管理结果集缓存大小
结果集缓存的数据量受到行数(RESULT_CACHE_MAX_ROW_COUNT)和空间(RESULT_CACHE_MAX_BYTE_SIZE)的限制。数据量的行数和空间任意一个超过阈值,结果集缓存都会失败。
- 配置结果集缓存的行数阈值。默认值为1000。值为-1时,表示不限制结果集缓存的行数。
SET ADB_CONFIG RESULT_CACHE_MAX_ROW_COUNT = 10000;
- 配置结果集缓存的空间阈值。默认值为16777216,单位为Byte,即16MB。值为-1时,表示不限制结果集缓存的空间。
SET ADB_CONFIG RESULT_CACHE_MAX_BYTE_SIZE = 16777216;
重要
- 不建议将RESULT_CACHE_MAX_ROW_COUNT和RESULT_CACHE_MAX_BYTE_SIZE的配置值都修改为-1,可能会因为大结果集查询占满磁盘。
- 如果只设置其中一个参数值为-1,结果集缓存的数据量仍受另外一个参数的限制。
配置结果集缓存淘汰策略
结果集缓存不需要您手动管理,AnalyticDB MySQL会根据淘汰策略自动删除过期的结果集缓存。AnalyticDB MySQL支持两种淘汰策略,超时淘汰(RESULT_CACHE_EXPIRATION_TIME)和最大缓存数淘汰(RESULT_CACHE_MAX_TABLE_COUNT)。满足任意一种淘汰策略,缓存就会被删除。
- 超时淘汰策略指超时未被访问的结果集缓存会被自动删除。超过时间由RESULT_CACHE_EXPIRATION_TIME指定。默认值为86400,单位为秒(s)。配置超时淘汰策略。
SET ADB_CONFIG RESULT_CACHE_EXPIRATION_TIME = 86400;
- 最大缓存数淘汰策略指超出单个接入节点最大缓存数,最久未被访问的缓存会被自动删除。单个接入节点最大缓存数由RESULT_CACHE_MAX_TABLE_COUNT指定。默认值为100。配置最大缓存数淘汰策略。
SET ADB_CONFIG RESULT_CACHE_MAX_TABLE_COUNT = 100;
配置黑白名单
对于成千上万的查询任务,所有查询使用结果集缓存范围太广,而单个查询使用结果集缓存又过于精细。此时可以将表添加到黑名单或白名单,控制该表的查询是否使用结果集缓存。
SET ADB_CONFIG RESULT_CACHE_LIST_CONSTRAINT_MODE=[whitelist | blacklist | disable];
参数说明:- whitelist:使用白名单准入策略。
- blacklist:使用黑名单准入策略。
- disable(默认值):不使用黑白名单准入策略。
当开启黑白名单准入策略时,可以调整表级别的缓存属性RESULT_CACHE来实现不同的缓存准入限制。
ALTER TABLE <table_name> RESULT_CACHE=[default | enable | disable];
- 当未开启黑名单或白名单准入策略,则表缓存属性RESULT_CACHE无意义。符合使用限制的所有查询均可使用结果集缓存。
- 当开启黑名单准入策略时,表缓存属性RESULT_CACHE值设置为default或enable,包含该表的查询均允许使用结果集缓存。而RESULT_CACHE值为disable,包含该表的查询均不允许使用结果集缓存。
- 当开启白名单准入策略时,只有表缓存属性RESULT_CACHE值为enable时,包含该表的查询才允许使用结果集缓存。而RESULT_CACHE值为default或disable,包含该表的查询均不允许使用结果集缓存。
您可以执行以下SQL语句查看配置了黑白名单准入的表。
SELECT * FROM RESULT_CACHE_LIST_CONSTRAINT;