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

1. 背景

项目中有1000万条历史案卷,为某地方坐标系数据,我们的真实需求是将地方坐标系坐标反转成WGS84坐标,如果现在需要将其转换成百度坐标系数据。常规方案是先建立好整个该市的本地坐标和百度坐标之间的控制点库后再进行转换。但是在具体实施中发现转换特别慢,由于控制点库也有200多万条记录,大概一个点需要一秒钟才能转换完。

2.将Update变成Insert关键字段值的优化——优化1

最开始采用的是坐标转换完后,直接update历史案卷表。由于update的效率是相对低的,尤其是有一千万条记录时,即使对主键也做了索引,依然效率不高。这里便采用新建一张空表再insert的方案。同时考虑到不必要的字段太多,数据量太大,所以只将历史案卷的主键和坐标insert到新表中的方案进行优化。大概一个坐标转完可以是0.9秒左右,有一定提高,但不是特别明显。

3进行分表的优化——优化2

原始算法的转换步骤是:先从历史案卷表中获取一条记录,再根据记录坐标去控制点库获取该坐标对应的四角坐标的坐标值,然后再根据算法转换。

最明显的瓶颈将出现在:

a.从历史案卷中获取坐标的时间。

b.从控制点库中获取到两条记录(左上角控制点对,右下角控制点对)的时间。

可以想象,每次遍历完整控制点库是最消耗效率的地方。所以这里将采用对控制点库进行分库的优化方法。具体思路为,将控制点库按照每隔2万米,分割成一个独立的表。当坐标进行转换时,首先算出坐标落在哪个控制点表中,然后查询该表进行转换。

现在测试将控制点库分成了16个表,效率提高到一秒钟可以转换5个点,大概也就是0.2秒转换一个。可以预见如果分更多表效率将更大的提高。不过考虑到避免数据太过碎片化不利于管理。这里将再进行分区的优化尝试。

4.进行分区的优化——优化3

Mysql中提供了Range、List、Hash、Key四种分区方法,这里由于是地理坐标范围,所以采用Range来进行分区。目前将进行每5000M的范围做一个分区。

改完后效率变成了一秒可以转换20个左右坐标。

5.再次优化插入数据——优化4

由于待转换数据太多,导致插入数据在进入几十万条后明显变慢。并且之前是转换完一条就立马插入,这也导致数据库操作频繁,效率下降。

所以这里改成:

a.批量插入,即以事物形式一次插入千条数据。

b.分表插入,当插入满50万条后,则创建新的表,继续插入。

这次修改后,效率又提高不少,大概到每秒转换30多个点。

6.代码级别优化,开启多线程——优化5

启用多线程进行转换,目前开启四个线程。转换效率可以达到每秒100个左右。

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

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

                                           

WebGIS项目中利用mysql控制点库进行千万条数据坐标转换时的分表分区优化方案的更多相关文章

  1. [MyBatis]五分钟向MySql数据库插入一千万条数据 批量插入 用时5分左右

    本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 我的数据库环境是mys ...

  2. [MyBatis]向MySql数据库插入一千万条数据 批量插入用时6分 之前时隐时现的异常不见了

    本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 这次实验的环境仍然和上 ...

  3. 在 Ionic2 TypeScript 项目中导入第三方 JS 库

    原文发表于我的技术博客 本文分享了在Ionic2 TypeScript 项目中导入第三方 JS 库的方法,供参考. 原文发表于我的技术博客 1. Typings 的方式 因在 TypeScript 中 ...

  4. JNI_Android项目中调用.so动态库

    JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 參考:http://blog.sina.com.cn/s/blog_4298002e01013zk8.html 上一篇笔者 ...

  5. 如何在Ionic2项目中使用第三方JavaScript库

    onic的官网放出一记大招Ionic and Typings,来介绍如何在Ionic2项目中使用第三方JavaScript库. 因为在前阵子正好想用一个非常有名的第三方JS库ChartJs来实现一些东 ...

  6. 关于在项目中遇到MySQL数据库死锁的问题

    在MySQL中, 当一个事务去更新某条数据, 还没有提交的时候, 第二个事务去更新该数据, 则会出现等待获取锁超时异常: >> Lock wait timeout exceeded; tr ...

  7. Flask项目中使用mysql数据库启动项目是发出警告

    Flask项目中使用mysql数据库启动项目是发出警告: Warning: (1366, "Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA ...

  8. 在Go语言项目中使用Zap日志库

    在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...

  9. LOAD DATA INFILE读取CSV中一千万条数据至mysql

    作业要求 构建一个关系模式和课本中的关系movies(title,year,length,movietype,studioname,producerC)一样的关系,名称自定,在这个关系中插入1000万 ...

随机推荐

  1. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  2. 开始学nodejs——net模块

    net模块的组成部分 详见 http://nodejs.cn/api/net.html 下面整理出了整个net模块的知识结构,和各个事件.方法.属性的用法 net.Server类 net.Socket ...

  3. TypeScript Vs2013 下提示Can not compile modules unless '--module' flag is provided

    VS在开发TypeScript程序时候,如果import了模块有的时候会有如下提示: 这种情况下,只需要对当前TypeScript项目生成设置为AMD规范即可!

  4. javascript中的事件冒泡和事件捕获

    1.事件冒泡 IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).以下面的HTML ...

  5. TortoiseGit 文件比对工具使用 Beyond Compare 和 DiffMerge

    TortoiseGit 内置的文件比对工具是 TortoiseMerge,用于文件比对和解决冲突合并,TortoiseGit 还支持外部的比对工具使用,比如 Beyond Compare 和 Diff ...

  6. 谈谈JS中的函数节流

    好吧,一直在秋招中,都没怎么写博客了...今天赶紧来补一补才行...我发现,在面试中,讲到函数节流好像可以加分,尽管这并不是特别高深的技术,下面就聊聊吧! ^_^ 备注:以下内容部分来自<Jav ...

  7. 用FSM一键制作逐帧动画雪碧图 Vue2 + webpack

    因为工作需要要将五六十张逐帧图拼成雪碧图,网上想找到一件制作工具半天没有找到,就自己用canvas写了一个. 写成之后就再没有什么机会使用了,因此希望有人使用的时候如果遇到bug了能及时反馈给我. 最 ...

  8. .NET Core 2016 回顾

    都在回顾自己的2016,今天我们来看看.NET Core的2016. 每一年的脚步的确是快,转眼间马上就2017.新的一年,带着理想和抱负继续出发. 1 月 ASP.NET 5 改名 ASP.NET ...

  9. 利用for循环找出1000以内的质数

    var n=0; for(var i=2;i<=1000;i++){  var zhishu=true;  for(var j=2;j<i;j++){    if(i%j==0){    ...

  10. iOS 多线程之GCD的使用

    在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...