文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.    背景

准确说,该项目的迹展示涉及到两个方面,一个是轨迹查询展示,一个是轨迹信息挖掘展示。随着轨迹表数据的增加,以及轨迹信息挖掘涉及到的案卷表数据的增加,项目上目前出现了比较明显的轨迹展示性能问题。

这里,我尝试从代码流程逻辑、GPS采集优化、数据库常用优化(轨迹历史数据迁移和索引建立)、表结构重构,Redis缓存的引用五个方面来进行优化。

2.    代码流程逻辑优化

2.1公有数据的合理复用

在最初设计流程时,轨迹展示和轨迹信息挖掘是两个相对独立部分,一个负责地图端的轨迹展示、一个负责提供给业务端(MIS和手机)来调用展示轨迹挖掘信息,所以致使两个功能成为了各自独立的接口。

但是随着历史轨迹表数据的激增,这种分离方式出现了明显的性能弊端——即轨迹查询结果的复用。

轨迹信息挖掘流程的第一步,需要获取到待挖掘的所有轨迹点。而这些点在轨迹展示时,就已经获取到了。以之前的两个业务独立的逻辑,将会导致轨迹获取的重复查询。

这里,我建议将流程稍作修改,如下图所示:

  

2.2轨迹信息挖掘的查询瘦身

在最初的轨迹信息与案卷关联的挖掘中,我们最开始查询四张表:案卷表(dlmis.to_rec)、核查核实表(dlmis.to_mi_patrol_task)、历史案卷表(dlhist.to_his_rec)、历史核查核实表(dlhist.to_his_mi_patrol_task)。但是,经过测试发现历史案卷表和历史核查表往往很大,是查询的瓶颈所在。所以我们增加了一个参数(histrec)来进行表的查询控制。

当histrec值为false时,查询案卷表和核查核实表这一组;当为ture时,查询历史案卷表和历史核查核实表那一组。

由于系统默认是展示当天轨迹信息挖掘,所以histrec参数为true,从而避免了初始查询时对历史案卷那一组的查询。

3.GPS采集优化

在GPS采集源头,通过对行为者的状态分析(停留、行走、跑步等),实现对GPS采集频率的控制。并且通过对GPS信号、位置精度等附加信息分析,过滤掉无效GPS以及室内GPS数据。从而增加有效GPS的同时,实现GPS采集存储量的减负。

4.数据库常用优化

4.1历史轨迹迁移

从业务层面分析,得出针对一个月前的轨迹查询在业务上来讲基本是无作用的(一个月前的绩效已考核、工资已发放)。甚至在该项目现场,七天前的轨迹,也不是业主所关心的。所以这里采用一个定时任务,在每天深夜(避免迁徙中对正在上传的轨迹造成影响)进行轨迹的迁徙,轨迹表中只保留最近七天的轨迹,而每一个当天的轨迹均移至历史轨迹表中。据目前初步统计,七天的轨迹量大概在80W条上下,数量得到很好的控制。

4.2轨迹表上建立索引

GIS端的轨迹查询语句为:

select aa.coordinate_x as coordinatex,aa.coordinate_y as coordinatey,to_char(aa.update_time, 'YYYY-MM-DD HH24:MI:SS') as logtime  from dlmis.tr_log_patrol_pos aa where aa.update_time>= ?  and aa.update_time <? and aa.patrol_id = ? and revised_coord_y<>-1 and aa.coordinate_x>0 and aa.coordinate_y >0 order  by  aa.update_time

以patrol_id和update_time分别建立索引:

5.表结构重构

针对轨迹迁徙方案,依然存在隐患,即如果真出现需要对一个月前的历史轨迹查询时,效率问题无法回避。这里以大表改小表的思路进行发散,在暂时不考虑某些项目上可能造成的影响,提出两种表结构重构的方案。

5.1分表方案(方案一)

假设,我们每隔一周(以一周为例)建立一个轨迹表,表中只存放该周的轨迹,那么每周轨迹表中的数据量将大大减少。表的命名以年_周,比如(2017_18,表示2017年18周),在查询轨迹时,算出查询时间所对应的轨迹表,进行查询即可。

5.2轨迹摘要表的运用(方案二)

提出该方案的设想是,我们以降低数据冗余、减少磁盘读操作,在分析业务的基础上进行设计。以下为目前的轨迹表:

我们观察历史轨迹表,可以发现一个人一天可以出现一千条数据。这些数据中,人员ID为重复信息,人员的速度、角度、道路等等均是轨迹查询中不需要的字段。针对这种现象,我们提出一个轨迹摘要表的概念,我将该表设计为如下:

Id(流水号)

patrolID(监督员编号)

Date(日期,单位天)

报文(blob二进制)

其中最核心的是报文,报文中我们将以(x,y,createtime)的格式,转换成二进制方式存储当天的所有有效轨迹。

这样,轨迹摘要中针对某个监督员的轨迹信息,将只有一条记录了。如果要查询某天的轨迹,我们只需要date和partolid进行过滤即可获得报文,然后解析报文。同时查询的效率会大大提高,假设一个人之前一天有1000条数据,那么现在只有一条数据。之前3个月1000W条数据,那么现在将只有1W条数据。

这里,涉及到报文内容的实时更新,如何能有效实现报文的追加更新呢?这里,引出我们的另一个优化,Redis缓存的应用。

6.Redis的运用

轨迹的写入,无论是针对轨迹摘要表,还是针对原来的轨迹表,均是一个不断产生开销的操作。而且针对轨迹表,查询最高的应该是当天轨迹查询。所以,针对当天不断上报的轨迹,我们可以将其都先存入redis中,在通过定时任务,于深夜同步写入至轨迹表中。

同样,查询轨迹时,针对当天轨迹的查询,也优先从redis中获取。

7.总结

该项目的轨迹优化方案,建议以三步走战略来进行:

a.先完成代码逻辑、数据库常用优化,然后观察效果。

b.如果效果一般,再进行Redis运用的改造。

c.最后,代价最大的表结构重构,个人觉得效果会很好,但是极有可能对现有业务等造成影响。

                          -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

      如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                        

轨迹系列8——记某真实项目中轨迹展示查询效率优化方案一(初步设计)相关推荐

  1. 从真实项目中抠出来的设计模式——第三篇:责任链模式

    一:现实场景 有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的ifelse逻辑,比如拿项目里面的案例来说,如果当前发送的是彩信,此种状态需要如何给实体赋值,如果是短信,邮件又是其他方式的赋 ...

  2. 从真实项目中抠出来的设计模式——第二篇:过滤器模式

    一:实际场景介绍 我们在给用户做订单催付通知的时候,会有这样的一种场景,用户在系统后台设置一组可以催付的规则,比如说订单金额大于xx元,非黑名单用户,来自 哪个地区,已购买过某个商品,指定某个营销活动 ...

  3. 前端人真实项目中遇到的问题总结

    // 以下题目有简单也有难的(具体看你怎么定义). // 如果能做到立马想出答案的,则前端算是学的不错的了. // 如果需要百度才能做出来(直接百度答案的,我就只能说你开心就好),那么也说明一般. / ...

  4. Java之真实项目中的章节排序实例

    开心一笑 [临终要求: 一犯人被执行枪决 ,由于子弹是劣质的,第一枪没放出,接着又放了第二枪-第三枪-这时犯人哭了:大哥你掐死我吧,太他妈吓人了!] 视频教程 大家好,我录制的视频<Java之优 ...

  5. 从真实项目中抠出来的设计模式——第一篇:策略模式

    有时候因为种种原因导致我们会写出很多丑陋的代码,比如赶工时,短暂性的偷懒,不会设计模式等等导致代码沉积,一个cs上万行代码这样场景是有发生, 当然这里也包括我...所以时间充裕一点之后就想重构一下,毕 ...

  6. 前端学习笔记系列一:5 在项目中引入阿里图标icon

    进入到阿里的图标库网站,里面有上百万种icon,https://www.iconfont.cn,需要注册一个帐号,然后进入到这个页面,在这里点击右下角的带加号的图标,创建一个新的项目,名称与你要使用图 ...

  7. 一个项目中能提出哪些数据库优化_如何有效进行项目集管理?

    随着企业的扩张,业务往来日益增多,企业同时开展多个项目是不可避免的,如何有效进行多项目管理,是许多企业急需解决的问题. 这一趋势导致多项目管理角色的兴起.它与项目高效和谐地配合,为企业的快速发展提供了 ...

  8. 我在项目中对 MySQL 做的优化

    原标题:我在 MySQL 上做了哪些优化 原文链接:zhoupq.com/我在-MySQL-上做- 转载请注明出处 本文记录了我这一年的时间里是如何对项目中用到的 MySQL 进行优化.带有一定的主观 ...

  9. vue项目中vue-echarts讲解及常用图表方案实现

    图表类的项目操作一般常见于管理平台系统,移动端项目中并不是特别常见,不常见不代表没有,在一些商城类应用中,商家需要看到商品的销量分析,盈利分析等,就需要用到图标,比较常用的图标库,像百度的ECHART ...

最新文章

  1. java 日志脱敏框架 sensitive,优雅的打印脱敏日志
  2. response.addCookie(cookie)添加cookie失败.
  3. MyBatis-Plus 乐观锁 防止超卖、逻辑删除、自动填充、Id自增
  4. 解决ubuntu首次安装Mysql之后,首次登录出现ERROR 1698 (28000): Access denied for user 'root'@'localhost'的方法
  5. 前端系统化学习【JS篇】:(二)Javascript、变量和值的简述
  6. 【CMAKE】指定编译器架构(x86 or x64)
  7. [译] 如何在安卓应用中使用 TensorFlow Mobile
  8. Bailian2760 数字三角形【DP】
  9. Latex 语法总结(持续更新)
  10. [转载]探索J2ME:用GCF通信
  11. 计算机类专业分类及优缺点,计算机专业优势介绍及学科分类
  12. 使用docker 搭建 ceph 开发环境,使用aws sdk 存储数据
  13. C语言:围圈报号排序问题
  14. JAVA开源仿知乎问答源码
  15. 剑指offer刷题笔记
  16. 解开TDH执行增删改查等命令
  17. 用计算机制作板报教案,浅析“用Word制作电子板报”的教学设计
  18. 让项目在docker上跑起来
  19. 支付宝老版 合作商家ID 安全检验码 查看方法
  20. python输出带颜色的字体

热门文章

  1. Ubuntu下对双显卡的支持问题
  2. NSIS 的 Modern UI 教程(二)
  3. 摸清全国农村集体家底-农业大健康:产权改革谋定清产核资
  4. Flask项目常见面试问题
  5. [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?...
  6. 链表反转leetcode206
  7. 【第一行代码笔记】(一)
  8. 二叉树路径应用举例(基于非递归后序遍历)
  9. DIV+CSS布局,第五课,DOCTYPE的选择,零起点细说网站制作
  10. 程序员到底需要什么样的需求文档?