WebGIS項目中利用mysql控制點庫進行千萬條數據座標轉換時的分表分區優化方案

文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/算法

1. 背景

項目中有1000萬條歷史案卷,爲某地方座標系數據,咱們的真實需求是將地方座標系座標反轉成WGS84座標,若是如今須要將其轉換成百度座標系數據。常規方案是先創建好整個該市的本地座標和百度座標之間的控制點庫後再進行轉換。可是在具體實施中發現轉換特別慢,因爲控制點庫也有200多萬條記錄,大概一個點須要一秒鐘才能轉換完。sql

2.將Update變成Insert關鍵字段值的優化——優化1

最開始採用的是座標轉換完後,直接update歷史案卷表。因爲update的效率是相對低的,尤爲是有一千萬條記錄時,即便對主鍵也作了索引,依然效率不高。這裏便採用新建一張空表再insert的方案。同時考慮到沒必要要的字段太多,數據量太大,因此只將歷史案卷的主鍵和座標insert到新表中的方案進行優化。大概一個座標轉完能夠是0.9秒左右,有必定提升,但不是特別明顯。數據庫

3進行分表的優化——優化2

原始算法的轉換步驟是:先從歷史案卷表中獲取一條記錄,再根據記錄座標去控制點庫獲取該座標對應的四角座標的座標值,而後再根據算法轉換。微信

最明顯的瓶頸將出如今:多線程

a.從歷史案卷中獲取座標的時間。測試

b.從控制點庫中獲取到兩條記錄(左上角控制點對,右下角控制點對)的時間。優化

能夠想象,每次遍歷完整控制點庫是最消耗效率的地方。因此這裏將採用對控制點庫進行分庫的優化方法。具體思路爲,將控制點庫按照每隔2萬米,分割成一個獨立的表。當座標進行轉換時,首先算出座標落在哪一個控制點表中,而後查詢該表進行轉換。spa

 

如今測試將控制點庫分紅了16個表,效率提升到一秒鐘能夠轉換5個點,大概也就是0.2秒轉換一個。能夠預見若是分更多表效率將更大的提升。不過考慮到避免數據太過碎片化不利於管理。這裏將再進行分區的優化嘗試。線程

 

4.進行分區的優化——優化3

Mysql中提供了Range、List、Hash、Key四種分區方法,這裏因爲是地理座標範圍,因此採用Range來進行分區。目前將進行每5000M的範圍作一個分區。blog

 

改完後效率變成了一秒能夠轉換20個左右座標。

5.再次優化插入數據——優化4

因爲待轉換數據太多,致使插入數據在進入幾十萬條後明顯變慢。而且以前是轉換完一條就立馬插入,這也致使數據庫操做頻繁,效率降低。

因此這裏改爲:

a.批量插入,即以事物形式一次插入千條數據。

b.分表插入,當插入滿50萬條後,則建立新的表,繼續插入。

此次修改後,效率又提升很多,大概到每秒轉換30多個點。

6.代碼級別優化,開啓多線程——優化5

啓用多線程進行轉換,目前開啓四個線程。轉換效率能夠達到每秒100個左右。

 

                       -----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

                                                                若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                           

相關文章
相關標籤/搜索