我行核心所有实时、批处理都在TD上运行。
仅以TD解释,不同实现应对方法不同。
TD的分库是使用表的shardkey的hash计算值来分的,这个键是表的一个字段。
如单表查询,如查询条件有shardkey字段并指定值,系统会将SQL直接路由至具体数据对应节点查询,效率最高。如这个键未指定值,则系统将SQL分发所有节点分别执行,再由代理层汇总数据返回,效率也不差。
多表关联情况,如两表关联条件包含shardkey互等,两表的关联数据,必都分别落在同一物理节点,系统将语句下发各节点分别执行,再汇总数据,这样效率很高。如没有shardkey的关联,则需代理将两表全量数据拉至代理,再运算,效率极差。
所以设计的关键是shardkey的设计与选择。
查指定卡的交易流水:
如关联的是两个流水表,那以两个流水表共有的流水字段作shardkey即可,但这种方式并不太好。最好是给表加卡号的冗余字段,让每个表都有卡号,并以卡号作为shardkey,并给查询条件加上卡号的关联,这样通用性更强。
单一场景很好做,但要多场景适用需全面考虑设计。