zoukankan      html  css  js  c++  java
  • AppBoxFuture: 大数据表分区的3种策略

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

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

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

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

    1. 指定键值分区

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

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

    2. 键值Hash分区

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

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

    3. 时间范围分区

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

    4. 组合分区

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

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

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

    注意:目前仅实现谓词的相等判断且必须指定全部分区键谓词(即目前只能从确定分区内扫描),>, >=, <, <=, Between尚未实现。

    三、小结:

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

  • 相关阅读:
    第二周作业
    第二次作业
    第一周作业
    我的2018年终总结
    css总结
    python中使用selenium错误-Firefox浏览器
    postman中 form-data、x-www-form-urlencoded、raw、binary的区别
    谷歌地图API(一)
    2014新年开题
    图书馆管理系统-需求分析
  • 原文地址:https://www.cnblogs.com/BaiCai/p/11112112.html
Copyright © 2011-2022 走看看