WebGIS项目中利用mysql控制点库进行千万条数据坐标转换时的分表分区优化方案
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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控制点库进行千万条数据坐标转换时的分表分区优化方案的更多相关文章
- [MyBatis]五分钟向MySql数据库插入一千万条数据 批量插入 用时5分左右
本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 我的数据库环境是mys ...
- [MyBatis]向MySql数据库插入一千万条数据 批量插入用时6分 之前时隐时现的异常不见了
本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 这次实验的环境仍然和上 ...
- 在 Ionic2 TypeScript 项目中导入第三方 JS 库
原文发表于我的技术博客 本文分享了在Ionic2 TypeScript 项目中导入第三方 JS 库的方法,供参考. 原文发表于我的技术博客 1. Typings 的方式 因在 TypeScript 中 ...
- JNI_Android项目中调用.so动态库
JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 參考:http://blog.sina.com.cn/s/blog_4298002e01013zk8.html 上一篇笔者 ...
- 如何在Ionic2项目中使用第三方JavaScript库
onic的官网放出一记大招Ionic and Typings,来介绍如何在Ionic2项目中使用第三方JavaScript库. 因为在前阵子正好想用一个非常有名的第三方JS库ChartJs来实现一些东 ...
- 关于在项目中遇到MySQL数据库死锁的问题
在MySQL中, 当一个事务去更新某条数据, 还没有提交的时候, 第二个事务去更新该数据, 则会出现等待获取锁超时异常: >> Lock wait timeout exceeded; tr ...
- Flask项目中使用mysql数据库启动项目是发出警告
Flask项目中使用mysql数据库启动项目是发出警告: Warning: (1366, "Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA ...
- 在Go语言项目中使用Zap日志库
在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...
- LOAD DATA INFILE读取CSV中一千万条数据至mysql
作业要求 构建一个关系模式和课本中的关系movies(title,year,length,movietype,studioname,producerC)一样的关系,名称自定,在这个关系中插入1000万 ...
随机推荐
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...
- excel 日期/数字格式不生效需要但双击才会生效的解决办法
原因: Excel2007设置过单元格格式后,并不能立即生效必须挨个双击单元格,才能生效.数据行很多.效率太低. 原因:主要是一些从网上拷贝过来的日期或数字excel默认为文本格式或特殊-中文数字格式 ...
- ExtJS 4.2 组件的查找方式
组件创建了,就有方法找到这些组件.在DOM.Jquery都有各自的方法查找元素/组件,ExtJS也有自己独特的方式查找组件.元素.本次从全局查找.容器内查找.form表单查找.通用组件等4个方面介绍组 ...
- html与html5
HTML 是一种在 Web 上使用的通用标记语言.HTML 允许你格式化文本,添加图片,创建链接.输入表单.框架和表格等等,并可将之存为文本文件,浏览器即可读取和显示.HTML 的关键是标签,其作用是 ...
- MFC中如何画带实心箭头的直线
工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决:思路如下: (1) 两个点(p1,p2)确定一个直线,以直线的一个端点(假设p2)为原点,设定一个角度 (2)以P2为原点得到向量P2P1 ...
- CGI与FastCGI nginx+PHP-FPM
本文转载自CGI与FastCGI 1.当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html. ...
- JS继承类相关试题
题目一: //有关于原型继承的代码如下:function Person(name) { this.name = name;}Person.prototype = { getName : f ...
- 一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
在目前的软件项目中,都会较多的使用到对文档的操作,用于记录和统计相关业务信息.由于系统自身提供了对文档的相关操作,所以在一定程度上极大的简化了软件使用者的工作量. 在.NET项目中如果用户提出了相关文 ...
- Linux C语言解析并显示.bmp格式图片
/************************* *bmp.h文件 *************************/ #ifndef __BMP_H__ #define __BMP_H__ # ...
- oracle SEQUENCE 创建, 修改,删除
oracle创建序列化: CREATE SEQUENCE seq_itv_collection INCREMENT BY 1 -- 每次加几个 STA ...