大数据量数据存储分表实例(企业级应用系统)附原码

随着数据不断增长,数据库中单表无法满足大数据量的存储,所以我们就提出按照自然时间、单站点信息分表来存储大量秒级数据。

例如:大气、水利、交通(GPS)信息监测系统中的实时数据进行存储,一般时按照开始时间、结束时间、单站点、多站点、监测项目等方式进行数据查询、分析、图表。

如 按5分钟单站点的数据12*24(小时)*365(天)*(监测项)10=100W ,也就是一个站点一年数据量 100w条,100站*100W =1亿条这样的数据是无法满足快速查询。

所以我们就按照 ”tb_5M_年_站号“建表名称,tb_时间刻度_年份_站号建表 。 "TB_5M_2016_A0001", "TB_5M_2016_A0002", "TB_5M_2016_A0003",, "TB_5M_2016_A0004"

条张表 存储100W,如存储1分钟的数据单表就 500W条, 如1秒钟数据:60*500W=3亿条数据,这样不行啊,我们要以在分表,分表规则中加一个月份,tb_5M_年_月_站号,这里就不说了。

问题来,我们如何方便快捷编写代码那?,我们还想用ORM(EF)进行数据查询,就拿我们真实项目来说吧。

思路,我们用.NET开发,在数据库建基本表(tb_5m_Base)来实现EF,用 DbContext实现数据访问。

别的不多说了,直接来代码吧,

功能5分钟数据查询,用户指定开始时间、结束时间、单(多)选择站点、单(多)选择监测 项目,进行数据查询功能。

代码发如下:


public class Tb_5m_Base
    {
       
        public int   ID{ get; set; }
        public Datatime Time{ get; set; }
        public string Pcodes  { get; set; }
         
        public double Values{ get; set; }
    }



 public partial class EntityFrameworkDataContext : DbContext
    {
        static EntityFrameworkDataContext()
        {
            Database.SetInitializer<EntityFrameworkDataContext>(null);
        }


        public EntityFrameworkDataContext()
            : base("Name=EntityFrameworkDataContext")
        {
        }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
         
            modelBuilder.Configurations.Add(new tb_5m_Base());
          }

    public DbSet< tb_5m_Base>  TB_5m_Base{ get; set; }
     

}

  public class BLLDataQuery
    {
      

       /// <summary>
        /// 获取数据
        /// </summary>
     
        /// <param name="startTime">开始日期</param>
        /// <param name="endTime">结果日期</param>

       /// <param name="stationids">站点ID :1,2,3</param>

       /// <param name="pcodus">监测项 :EC,PC,MC</param>
        /// <returns></returns>
 public static List<tb_5m_Base> GetMinuteData( DateTime startTime, DateTime endTime,string stationids, string pcodus)
 {
    List<tb_5m_Base> list = new List<tb_5m_Base>();
    string[] strArray = stationids.Split(new char[] { ',' });
    int year = startTime.Year;
    int num = endTime.Year;
    string str = string.Empty;
    string commandText = string.Empty;
    pcodus=pcodus;
    while (year <= num) //年份跨年也没问题 
    {
        foreach (string strstationid in strArray) //站点
        {
            tbname= string.Format("tb_5m_{0}_{1}_Src", year, strstationid );
            commandText = string.Format("Select * from {0} where TIME between '{1}' and '{2}' and  pcodes in ({3}) ", new object[] { tbname, startTime, endTime, pcodus});
            try
            {
                using (EntityFrameworkDataContext _dbcontext = EntityFrameworkDataContext.CreateDbContext)
                {
                    list.AddRange(_dbcontext.Database.SqlQuery<tb_5m_Base>(sql,new paramentList[0]).ToList<tb_5m_Base>());
                }
            }
            catch (Exception exception)
            {
              
            }
        }
        year++;
    }
    return list;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是一种常用的数据库优化策略,可以将数据按照某种规则分散到不同的中,从而降低单张数据和查询复杂度,提高数据库的性能和稳定性。以下是一个基于MySQL的分方案: 1. 确定分规则 首先需要确定分的规则,可以按照时间、地域、业务类型等多个维度进行分。例如,按照时间分可以将数据按照年、月、日、小时等时间段进行分;按照地域分可以将数据按照国家、省份、城市等地理位置进行分;按照业务类型分可以将数据按照产品、订单、用户等进行分。 2. 创建分 根据确定的分规则,创建对应的分。例如,按照时间分可以创建类似于名为“table_202101”、“table_202102”等不同时间段的;按照地域分可以创建类似于名为“table_china”、“table_usa”等不同地理位置的;按照业务类型分可以创建类似于名为“table_product”、“table_order”、“table_user”等不同业务类型的。 3. 选择合适的分键 在创建分时,需要选择合适的分键。分键决定了数据在分时应该被分配到哪个中。分键的选择需要考虑到数据的分布情况和查询的频率。例如,按照时间分时可以选择时间字段作为分键,按照地域分时可以选择地理位置字段作为分键。 4. 管理分数据 在使用分后,需要进行分数据的管理,包括数据的导入、查询、删除、备份等操作。由于数据被分散到不同的中,需要对分数据进行整合或者分散查询,可以使用联合查询、视图等技术来实现。在备份分数据时,需要分别备份每个分,保证数据的完整性和一致性。 总的来说,分是一种常用的数据库优化策略,可以帮助提高数据库的性能和稳定性。但是,在使用分时需要根据具体的业务需求进行规划和设计,合理选择分规则和分键,以及进行分数据的管理和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值