之前的文章“分而治之”在介绍大表分区时,作者尚未实现不同的分区策略,即只能按指定的分区键进行分区。这次作者完善了一下分区策略,在规划大表分区时可以按Hash或者时间范围进行分区,所以本篇介绍不同的分区策略适用的场景,同时介绍一下表扫描时如何指定从特定分区查询数据。

一、分区策略及其适用场景:

  在新建实体模型时,根据数据是否动态增长以及预估数据规模后确定合适的分区策略,另外根据作者虚拟机的配置单分区的记录数在100万内比较合适:

1. 指定键值分区

添加分区键时指定某个实体成员作为分区键,适用于:

  • SaaS类应用按租户进行数据分区;
  • 基础数据如商品按不同类型进行数据分区;
  • 动态数据如结算单按不同账期进行数据分区。

    AppBoxFuture: 大数据表分区的3种策略-LMLPHP

2. 键值Hash分区

添加分区键时指定成员并指定Hash数量作为分区键,适用于基础数据需要分区,且分区的总数可以确定在一定范围内。

AppBoxFuture: 大数据表分区的3种策略-LMLPHP

3. 时间范围分区

添加分区键时指定时间类型的成员并指定按年、月、日作为分区键,适用于动态增长的数据按时间范围进行分区,最简单的例子是订单按年分区存储。

AppBoxFuture: 大数据表分区的3种策略-LMLPHP

4. 组合分区

可以添加多个分区键组合分区,如SaaS应用按租户然后按年进行分区。

AppBoxFuture: 大数据表分区的3种策略-LMLPHP

二、如何从指定分区查询数据:

  之前实现的TableScan在扫描表数据时,如果是分区表会依次扫描各个分区,这次作者完善了一下TableScan的实现,在明确知道数据在哪个分区或分区范围内时,可以指定分区谓词,从而从指定的表分区内扫描数据。示例代码如下:

var q = new TableScan<Entities.VehicleState>();
q.Partitions.Equal(t => t.VehicleId, 1); //指定分区谓词1
q.Partitions.Equal(t => t.CreateTime, new DateTime(2019, 6, 29)); //指定分区谓词2
return await q.ToListAsync(); //从指定分区扫描数据

三、小结:

  本篇主要介绍了大表分区的策略及其适用场景,Github上的运行时已经更新可测试,如果您有问题或Bug报告,请留言或提交Issue。另外您的关注与点赞将是作者最大的动力,以驱动作者全力以赴完成这个框架。

05-27 18:32