2012-03-14 54 views
10

我有一個4億行分區mysql表中的緯度/經度座標。 表增長@ 2000記錄一分鐘,舊數據每隔幾周刷新一次。 我正在探索如何對這些數據進行空間分析。MySQL Postgresql/PostGIS

大多數分析需要找出一個點是否在特定的緯度/經度多邊形或哪些多邊形包含該點。

我看到解決的多邊形(PIP)的問題點的方法如下:

  1. 創建MySQL函數,它接受一個點和幾何形狀,並返回一個布爾值。 簡單但不確定如何使用幾何來執行緯度/經度座標的操作,因爲幾何假設爲平面而不是球體。

  2. 創建MySQL函數,它的自定義數據結構的一個點和標識符,並返回一個布爾值。 多邊形頂點可以存儲在一個表中,並且函數可以使用球形數學計算PIP。大量的多邊形點可能會導致巨大的表格和較慢的查詢。

  3. 在mysql中留下點數據並在PostGIS中存儲多邊形數據,並使用應用服務器通過將點作爲參數來運行PostGIS中的PIP查詢。

  4. 端口從MySQL到PostgreSQL/PostGIS的應用。 這將需要很大的努力來重寫查詢和程序。 我仍然可以做到這點,但Postgresql在處理4億行時表現如何。 在google上快速搜索「mysql 10 billion rows」會返回許多結果。同樣的Postgres查詢返回沒有相關的結果。

想聽聽一些想法&意見。

+7

我有親自體驗Postgres運行300M +排桌 - 沒有汗水。 Skype使用Pg來跟蹤連接,用戶,會計等。除通信信道本身之外的所有信息。這是數十億記錄。 – dbenhur 2012-03-14 07:02:58

+0

那麼要達到300M有多容易/困難?它需要多少調整/優化?我曾使用Postgres閱讀過Skype,但大公司可能會投入資源並獲得任何工作。我正在尋找的是像你這樣的投入。 – Dojo 2012-03-14 07:30:15

+2

我們的PostgreSQL數據庫每秒處理約5000筆交易,最近2年每月處理約6億筆記錄。以前的MySQL服務器無法在同一個硬件上處理這個問題。 – 2012-03-14 07:36:57

回答

2

的一點想法。

第一次PostgreSQL和MySQL在性能調整方面完全不同。所以,如果你去的移植路線準備重新考慮你的索引策略。 PostgreSQL不僅具有比MySQL更靈活的索引,而且表格方法也非常不同,這意味着適當的索引策略與策略是不同的。不幸的是,這意味着你可能會有點掙扎。如果我能提供建議,我會建議先刪除所有非關鍵指標,然後根據需要少量添加它們。

第二點是,在這裏沒有人可能會給你大量的實用建議,因爲我們不知道你的程序的內部。在PostgreSQL中,你最好只索引你需要的索引,但是你可以索引函數的輸出(在這種情況下,真的有幫助),你只能索引表的一部分。

我比PostgreSQL的人更像一個MySQL人,所以當然我認爲你應該使用PostgreSQL。但是,不是告訴你爲什麼等等,並且你在這個規模上掙扎,我會告訴你幾件事情,如果我嘗試這樣做,我會考慮使用它。

  • 功能指標
  • 寫我自己的索引功能相關分析
  • PostGIS的是相當驚人的,非常靈活

最後,切換分貝的這個量將是一個學習曲線,你需要爲此做好準備。但是,PostgreSQL可以很好地處理卷。

1

這裏的行數是非常不相關的。 問題是可以通過索引完成多邊形工作中的多少點。

答案取決於多邊形的大小。

PostGIS非常快速地找到多邊形邊界框中的所有點。然後需要花費更多的努力來確定該點實際上是否在多邊形內。

如果你的多邊形很小(小邊框),查詢效率會很高。如果你的多邊形很大或者有一個邊界框大的形狀,那麼效率就會降低。

如果你的多邊形或多或少是靜態的,就有解決的辦法。您可以將多邊形劃分爲更小的多邊形並重新創建IDnex。那麼這個指數會更有效率。

如果你的多邊形實際上是multipolygons杉杉一步是將multipolygons分裂與ST_Dump多邊形和重建以及建立在結果的指標。

HTH

尼克拉斯

+0

無論如何,個人點(〜400百萬)都將存儲在數據庫中。 PIP是另一個問題。如果您指的是第2點,則在這種情況下,其存儲多邊形頂點的mysql表和UDF在該表上運行查詢以確定PIP結果。 – Dojo 2012-03-23 20:15:15