海量数据GPS定位数据库表设计
在开发工业系统的数据采集功能相关的系统时,由于数据都是定时上传的,如每20秒上传一次的时间序列数据,这些数据在经过处理和计算后,变成了与时间轴有关的历史数据(与股票数据相似,如下图的车辆行驶过程中的油量曲线、历史轨迹数据等)。当采集点多的时候,如上万个采集终端,再加上时间的累积,数据表会变得越来越大。数据库会越来越难以维护。
对历史数据操作的功能有历史数据的查询、统计图表曲线显示等等。而这些基于组合条件的历史查询功能和图表显示功能对数据库的压力可不小,如果听之任之,则海量的数据查询、统计计算会非常慢,用户体验很差。所以对于这种类型的表结构设计的时候,要制定好策略,避免以后再进行变动就麻烦了。
常规的策略就是分表。减少单一数据表的容量,通过增加合并查询和计算的逻辑的复杂度来换取减轻查询对数据库的压力。
1 表设计
1.1 设计思想
- 减少冗余数据的存储
- 数据写入时进行预运算
- 通过降低记录量提高系统的响应能力
- 降低磁盘的读操作
1.2 模型结构
GPS轨迹日志数据表保存原始的定位信息数据,索引表为日志数据表的索引信息内容,预处理模块完成新数据的预处理运算功能,保持索引表的信息与日志数据表的信息一致。
预处理模块建议为数据库内部的存储过程,保证对数据表操作的效率性能,通讯服务器以访问存储过程的方式,完成数据保存的事务处理。
1.3 模型原理
1.3.1 数据量
日志数据表最多保存四个月的定位信息数据,最高的记录为246亿条数据,数据量为2.3T(2012年9月-12月)。
索引表为日志数据表的索引信息,保留三个月零一天的车辆定位信息,每车每天为一条记录,最高数据量为432万,每个车辆每天的摘要信息保存在二进制的字段里。
摘要的数据内容包含定位时间、速度、里程、经度、纬度、角度状态信息,摘要在索引表里按规定的报文方式保存在索引表的二进制字段里,每个车辆一天产生的定位数据量为4320条,速度为0的定位信息所占比例为40%-60%左右,因此摘要里只记录有速度的定位数据,每车每天的实际摘要的数据量为2000左右。每个摘要信息量为30Bytes,因此每车每天产生的摘要为58K Bytes左右。
注:从统计角度考虑,摘要信息里也许会包括速度为0的定位信息。
1.3.2 读取性能
索引表根据业务操作的需要分为“最新定位索引表”、“三个月定位索引表”及“相关的统计索引表”。由于索引表里的记录量在百万级别内,可以实现毫秒级别的响应能力,所有的定位摘要数据保存在一个BLOB的二进制字段里,一次性快速读取出58K Bytes左右的数据,即可获得全天的车辆定位数据,避免数据库在磁盘上随机检索定位数据读而引起I/O性能瓶颈。
1.3.3 索引数据的写操作
每车每天的索引信息的更新,通过预处理模块完成,如果索引表里已经存在该车该天的记录,则进行二进制字段的更新,否则自动添加新的记录。新的车辆定位摘要信息通过规定好的报文协议直接追加到二进制字段后面。
每天通过后台作业的方式,定时删除索引表里最早一天的数据。一次删除的最大记录量为4.9万条(2012年12月31日)。
1.3.4 索引数据的读
读取车辆在某时间段内的定位数据,会从索引表里获得到相应天数的记录数,通过对BLOB字段进行数据协议的处理,获得定位摘要的记录集。
协议的解析工作可以由预处理模块解析,然后反转为表形式返回给web应用,也可以数据库直接交付给web应用服务器二进制数据,由web应用服务器完成数据的解析操作。
1.3.5 报表统计
索引表里二进制数据摘要的状态可以支持8种不同的状态,每个定位数据可以同时具有8种不同的状态,比如超速、偏移路线等,可以直接通过索引表进行统计,快速实时的获取最新的报表数据。
技术支持 By 省厓 QQ:2252224326 2252224326@qq.com 版权所有 http://blog.sina.com.cn/u/6029512413
海量数据GPS定位数据库表设计的更多相关文章
- Innodb IO优化 — 数据库表设计 转
数据库表设计这块学问比较多,我这里单从互联网角度出发同时结合Innodb的特性给出一些设计方法供大家参考.本文构建大概分两分部分:Innodb的特性及设计中如何利用这种特性. Innodb特性: In ...
- Oracle数据库表设计时的注意事项
表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据库菜鸟到数据库专家这个过程中,在表设计与 ...
- springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目
一个简单的用户登录系统 用户有账号密码,登录ip,登录时间 打开登录页面,输入用户名密码 登录日志,可以记录登陆的时间,登陆的ip 成功登陆了的话,就更新用户的最后登入时间和ip,同时记录一条登录记录 ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- ERP开发分享 1 数据库表设计
这是我的ERP设计经验分享系列,今天讲的是数据库的表设计(1),主要阐述: 1.单字段的主键:2.使用int32作为主键类型:3.使用版本字段处理乐观锁定:4.生效字段标明是否允许“被使用”:5.锁定 ...
- Acitiviti数据库表设计(学习笔记)
ACT_ID_*:与权限,用户与用户组,以及用户与用户组关系相关的表 ACT_RU_*:代表了流程引擎运行时的库表,RU表示Runtime ACT_HI_*:HI表示History当流程完成了节点以后 ...
- 抽屉之Tornado实战(2)--数据库表设计
经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 #一张表对应一个类 class ...
- 测试用数据库表设计和SessionFactory
本篇为struts-2.5.2和spring-3.2.0以及hibernate-4.2.21的整合开篇. 一.测试的数据库表. 用户.角色和权限关系表.数据库是Mysql5.6.为了考虑到一些特殊数据 ...
- Tornado之抽屉实战(2)--数据库表设计
经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 ? 1 2 3 4 5 6 7 ...
随机推荐
- vue2中使用ajax
vue中本身没有ajax功能,需要使用扩展,现在推荐使用的是axios,github地址如下 https://github.com/axios/axios 下面各个示例 <!DOCTYPE ht ...
- Java基础笔记(十五)——封装(续)static关键字
static 静态的,用static修饰的成员叫静态成员或类成员.类实例化的所有对象都会共用同一块静态空间.一个对象将值改变,其它对象的值也就随之改变了. 如:public static int pr ...
- POJ1024 Tester Program
题目来源:http://poj.org/problem?id=1024 题目大意: 有一个迷宫,迷宫的起点在(0,0)处.给定一条路径,和该迷宫墙的设置,要求验证该路径是否为唯一的最短路径,该种墙的设 ...
- Eugeny and Array(水题,注意题目描述即可)
Eugeny has array a = a1, a2, ..., an, consisting of n integers. Each integer ai equals to -1, or to ...
- Carryon的字符串
I J I: Carryon的字符串 时间限制: 1 s 内存限制: 128 MB 提交 我的状态 题目描述 Carryon最近喜欢上了一些奇奇怪怪的字符,字符都是英文小写字母,但 ...
- ElasticSearch 全文检索— ElasticSearch概述
ElasticSearch 产生背景 1.海量数据组合条件查询 2.毫秒级或者秒级返回数据 Lucene 定义 lucene是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一 ...
- C# 用正则表达式判断字符串是否为纯数字
Regex regex = new System.Text.RegularExpressions.Regex("^(-?[0-9]*[.]*[0-9]{0,3})$"); stri ...
- Centos7搭建redis,同一服务器启动两个端口的redis
1.安装redis [1]下载安装包 #准备安装文件夹 mkdir /usr/local/soft/redis #进入文件夹 cd /usr/local/soft/redis #下载安装包 wget ...
- ElasticSearch多个字段分词查询高亮显示
ElasticSearch关键字查询,将关键字分词后查询,多个字段,查询出来字段高亮显示. 查询方法如下: public List<NewsInfo> searcher2(String k ...
- Ubuntu下eclipse无法识别手机驱动(以小米2S为例子)
google官方开发向导里对Android手机已经设置了允许安装非market程序,并且处于usb调试模式,但是仍然在usb连接电脑后无法被识别的问题作了解释. 在Ubuntu Linux环境下需要添 ...