在ADS的FRONTNODE节点构建本地local的内置DB引擎,能够存储一定量的本地数据缓存表(Cache Table),进行快速本地单表查询。基于Cache table,可进行一定范围内的高效的分页数据查询。
实现方案介绍
- 存储:Cache Table存储在FRONTNODE本地节点上,每个节点上有多个Cache Table存储分桶,桶内采取换入换出机制,每个FRONTNODE上最大能容纳的Cache Table数据量为 256MB * FRONTNODE所在物理机的总核数 ;从业务角度来说,Cache Table为临时存储,不能作为永久性存储,主要用来加速局部数据复用查询和分页查询。
- 查询:Cache Table只支持单表查询。
- 管理:业务要通过捕获相应SQLException异常错误码,来感知Cache Table的失效,并决定是否进行重建。后续ADS会涉及Cache Table的自管理方案。目前业务方需要从业务侧维护Cache ID与Cache Table之间的映射。
使用介绍
1)创建Cache Table:
创建Cache Table的Sample语句:<PRE prettyprinted? linenums>
- CREATE TABLE cache.table_name OPTIONS(cache=true) AS SELECT * FROM yt_vip_user_tag LIMIT 200;
其中table_name为业务定义的Cache Table名, AS后面为结果需要存入Cache Table的查询语句。 成功执行后,会返回单列一行数据: cache_id ,用来唯一标识这张位于某台特定FRONTNODE节点上Cache Table:<PRE prettyprinted? linenums>
- CREATE TABLE cache.test_cache_table_1 OPTIONS(cache=true) AS SELECT * FROM yt_vip_user_tag LIMIT 200;
<PRE prettyprinted? linenums>
- +---------------------------------------------+
- | cache_id |
- +---------------------------------------------+
- | 1683065103.38806.6.0.082539 |
- +---------------------------------------------+
后续查询这张表,都需要带上cache_id的HINT进行查询。
2)单个Cache Table行数限制:
Cache Table单表存储的最大行数限制在
300000行。 假设select * from yt_vip_user_tag查询会返回999999行数据,若针对该查询结果创建Cache Table,会报错,错误码为 18066 ,错误消息为:” EXECUTE_CREATE_CACHE_TABLE_ERROR message=Exceed the max cache table row limitation: 300001”。:<PRE prettyprinted? linenums>
- mysql> CREATE TABLE cache.test_cache_table_1 OPTIONS(cache=true) AS select * from yt_vip_user_tag;
- ERROR 18066 (HY000): Error code: 18066, message: EXECUTE_CREATE_CACHE_TABLE_ERROR message=Exceed the max cache table row limitation: 300001
注意:创建Cache Table查询的SELECT语句不要加LIMIT子句,为保证创建Cache Table的查询结果集行数在限制( 300000 )以内,可以预先执行:<PRE prettyprinted? linenums>
- SELECT count(*) FROM (SELECT * FROM yt_vip_user_tag WHERE col1 = 2);
来确保创建该Cache Table的查询结果集在限制以内。
3)查询Cache Table:
每张Cache Table对应一个自己唯一的 Cache ID (创建时产生),每次查询Cache Table时,都需要带上该 Cache ID 的hint,例如:<PRE prettyprinted? linenums>
- /*+cache_id=1683065103.38806.6.0.082539*/select * from cache.test_cache_table_1;
Cache Table支持分页查询,例如:<PRE prettyprinted? linenums>
- /*+cache_id=1683065103.38806.6.0.082539*/select * from cache.test_cache_table_1 limit 10, 5;
Note
注意:在使用Cache Table实现分页方案时,生成的Cache Table仅仅为单表,最佳实践是仅仅对生成的Cache Table进行分页明细数据查询,请勿针对Cache Table进行复杂聚合计算和窗口函数分析查询。
4)查询Cache Table时的异常处理:
查询Cache Table异常分两种类型,查询本身的用户异常,即用户查询写错了,该类 SQLException 异常的错误码为 30018 ,用户需要检查查询是否正确; 另外一类,是Cache Table系统异常,该类 SQLException 异常的错误码为 30016 ,遇到 30016 ,用户需要考虑重建Cache Table。该类异常发生原因有:
- FRONTNODE节点重启、发布升级导致位于该FRONTNODE节点上的Cache Table失效;
- FRONTNODE节点上用来容纳Cache Table的bucket满,触发了换出的淘汰机制,导致目标Cache Table失效。
5)删除Cache Table:
业务可以删除指定的Cache Table,和查询一样,需要指定对应的Cache ID:<PRE prettyprinted? linenums>
- /*+cache_id=1683065103.38806.6.0.082539*/drop table cache.test_cache_table_1;