2012-03-14 12 views
10

私は4億行のパーティション化されたmysqlテーブルに緯度/経度座標を持っています。 テーブルは@分2000レコード増加し、古いデータは数週間おきにフラッシュされます。 このデータの空間解析を行う方法を模索しています。MySQL Postgresql/PostGIS

ほとんどの解析では、ポイントが特定の緯度/経度のポリゴンにあるかどうか、またはそのポリゴンにそのポイントが含まれているかどうかを調べる必要があります。

私は、ポリゴン内のポイントに取り組むの次の方法(PIP)の問題を参照してください。

  1. ポイントとジオメトリを取り、ブール値を返すのMySQL関数を作成します。 シンプルだがわからないジオメトリは球ではなく平らな面を想定しているので、緯度/経度座標の操作を行うためにジオメトリを使用する方法。

  2. カスタムデータ構造のポイントと識別子を取得し、ブール値を返すmysql関数を作成します。 ポリゴン頂点はテーブルに格納でき、関数は球面計算を使用してPIPを計算できます。ポリゴンポイントが多数あると、テーブルが膨大になりクエリが遅くなる可能性があります。

  3. ポイントデータをmysqlに残し、PostGISにポリゴンデータを保存し、アプリケーションサーバを使用してPostGISでPIPクエリをパラメータとしてプロビジョニングします。

  4. アプリケーションをMySQLからPostgresql/PostGISに移植します。 これは、クエリとプロシージャの書き換えに多くの労力を必要とします。 私はまだそれを行うことができますが、4億行を処理するPostgresqlはどれくらい良いですか。 googleで「mysql 10億行」をすばやく検索すると、多くの結果が返されます。 Postgresの同じクエリは関連する結果を返しません。

は、いくつかの考えに&提案を聞きたいです。

+7

私は300M以上の行テーブルを持つPostgresを個人的に使っています。 SkypeはPgを使用して接続、ユーザ、経理などを追跡します。通信チャネル自体を除くすべて。それは何十億という記録です。 – dbenhur

+0

300Mに達するのはどれくらい簡単か難しいですか?どのくらい調整/最適化が必要でしたか?私はPostgresを使ってSkypeについて読んだことがありましたが、大企業はリソースを投げて仕事をすることができます。私が探しているのはあなたのようなインプットです。 – Dojo

+2

私たちのPostgreSQLデータベースは、過去2年間〜1ヶ月あたり約5,000件のトランザクションを処理します。以前のMySQLサーバは同じハードウェア上でこれを処理できませんでした。 –

答えて

2

いくつかの考え。

最初のPostgreSQLとMySQLは、パフォーマンスチューニングに関しては全く別の獣です。したがって、移植の道を行く場合は、索引付け戦略を再考する準備をしてください。 PostgreSQLはMySQLよりもはるかに柔軟なインデックス作成を行うだけでなく、テーブルのアプローチも非常に異なります。つまり、適切なインデックス戦略は戦略とは異なります。残念ながら、これはあなたが少し苦労することを期待できることを意味します。私がアドバイスを与えることができたら、まず非キー索引をすべて削除し、必要に応じて控えめに追加することをお勧めします。

2番目の点は、ここで誰もあなたのプログラムの内部を知らないので、現時点では実用的なアドバイスを与えることができないということです。 PostgreSQLでは、必要なものだけを索引付けするのが最良ですが、ファンクションの出力を索引付けすることができます(この場合、が役に立ちます。)。また、表の一部のみを索引付けできます。

私はPostgreSQLの方がMySQLの人ではないので、もちろんPostgreSQLを使うべきだと思います。しかし、なぜあなたなどに言って、あなたがこの尺度で苦労しているのではなく、私がこれをやろうとしていたかどうかを見てみましょう。

  • は、関連する分析のためのインデックスのために私自身の関数を書く

    • 機能インデックスは
    • PostGISには、このボリュームでデシベルのスイッチング、かなり驚くべきそして最後に

    非常に柔軟であることを行っていますあなたはそれを準備する必要があります。しかし、PostgreSQLはボリュームをうまく処理できます。

  • 1

    ここでは行の数はまったく関係ありません。 問題は、インデックスで行うことができるポリゴン作業のポイントの量です。

    その答えは、ポリゴンの大きさによって異なります。

    PostGISは、ポリゴンの境界ボックス内のすべての点を見つけるのが非常に高速です。次に、ポイントが実際にポリゴンの内側にあるかどうかを調べるために、より多くの努力が必要です。

    ポリゴンが小さい場合(バウンディングボックスが小さい場合)、クエリは効率的になります。ポリゴンが大きかったり、バウンディングボックスが大きすぎる場合は効率が悪くなります。

    ポリゴンが多少静的である場合は、回避策があります。小さなポリゴンでポリゴンを分割し、idnexを再作成することができます。その後、インデックスがより効率的になります。

    ポリゴンが実際にマルチポリゴンである場合、最初のステップでは、マルチポリゴンをST_Dumpを使用してポリゴンに分割し、結果を再作成してインデックスを作成します。

    HTH

    ニクラス

    +0

    個々のポイント(〜4億)は、データベースに格納されます。 PIPは別の問題です。ポイント2を参照している場合は、ポリゴン頂点とUDFを格納するmysqlテーブルがPIP結果を決定するためにテーブルにクエリを実行します。 – Dojo