使用场景
很多分布式场景下,一个分片字段并不能满足所有的场景。
比如历史业务账单按用户 ID 来分片很适合做用户统计,但还有一些情况需要按订单号查询。这种情况下为了找到一个订单对应的记录,因为不知这条记录在哪个节点上,所以则需要全节点扫描。这里就无法体现分布式的优点,造成资源浪费(有效工作节点只有一个),特别是在高并发时,就很可能会造成 CPU 不够用。
基于这种情况,AntDB 的辅助表功能可以有效的应对。
原理
假如有表 t1(a,b,c,...),a 为分片列,b 为上面场景中的“订单”列。
- 针对非分片列 b 增加一张辅助索引表。辅助索引表的分片列为 b,和非分片字段 a,所有的数据都与主表 t1 保持同步。
- 如果查询 t1 表时包含的过滤条件中有 “b=xxx” 这样的表达式,则把xxx带入到对应的辅助索引表中,查询出列 a 的值所在的节点。
- 修改执行计划,只在上一步查找出的节点上执行查询。
最终的执行时间分三种情况:
- 一般情况:本需要全节点扫描的查询,现在只需要在两个节点上扫描。单次查询时间变长,高并发查询时间变短。
- 最优情况:第二步查询不到符合条件的数据,则不需要再扫描主表。单次查询时间不变,高并发查询时间变短。
- 最坏情况:第二步查到的数据在所有节点上,仍需要全节点扫描主表。单次查询时间变长,高并发查询时间变长。
所以创建辅助索引表和创建索引相同,要找那些重复率低的列。否则最终反而会使查询时间变长。
因为有辅助表的存在,主表数据的更新操作会变的更慢(主表数据更新时会同步更新辅助表)。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。