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

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

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

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

注意:实体成员做为分区键时是只读的,实体保存后不能修改分区键。code

1. 指定键值分区

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

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

2. 键值Hash分区

添加分区键时指定成员并指定Hash数量做为分区键,适用于基础数据须要分区,且分区的总数能够肯定在必定范围内。虚拟机

注意:Hash分区在查询数据指定分区谓词时只能进行相等判断hash

3. 时间范围分区

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

4. 组合分区

能够添加多个分区键组合分区,如SaaS应用按租户而后按年进行分区。
io

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

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

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(); //从指定分区扫描数据

注意:目前仅实现谓词的相等判断且必须指定所有分区键谓词(即目前只能从肯定分区内扫描),>, >=, <, <=, Between还没有实现。基础

3、小结:

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

相关文章
相关标签/搜索