web-dev-qa-db-ja.com

データベース/ SQL:経度/緯度データを保存する方法は?

パフォーマンスに関する質問...

位置情報データ(経度と緯度)を持つ家のデータベースがあります。

私がしたいのは、InnoDBデータベースエンジンを使用してMySQL(v5.0.24a)に位置データを保存する最良の方法を見つけて、間にあるすべてのホームレコードを返す多くのクエリを実行できるようにすることですx1およびx2 latitudeおよびy1およびy2 longitude

今、私のデータベーススキーマは

---------------------
Homes   
---------------------
geolat - Float (10,6)
geolng - Float (10,6)
---------------------

私のクエリは次のとおりです。

SELECT ... 
WHERE geolat BETWEEN x1 AND x2
AND geolng BETWEEN y1 AND y2
  • 上記で説明したのは、Float(10,6)を使用して経度と緯度を分離し、MySQLに緯度と経度のデータを保存する最良の方法ですか?そうでない場合は、何ですか?データ型として、Float、Decimal、Spatialがあります。
  • これは、パフォーマンスの観点からSQLを実行する最良の方法ですか?そうでない場合は、何ですか?
  • 別のMySQLデータベースエンジンを使用するのは理にかなっていますか?

更新:未回答

以下に3つの異なる回答があります。ある人はFloatを使用すると言います。ある人はINTを使用すると言います。ある人はSpatialを使用すると言います。

そこで、MySQLの「EXPLAIN」ステートメントを使用して、SQL実行速度を測定しました。経度と緯度のデータ型にINTまたはFLOATを使用する場合、SQL実行(結果セットのフェッチ)に違いはまったくないようです。

また、「BETWEEN」ステートメントを使用すると、「>」または「<」SQLステートメントを使用するよりも大幅に高速になるようです。 「>」および「<」ステートメントを使用するよりも、「BETWEEN」を使用する方がほぼ3倍高速です。

そうは言っても、Spatialを使用した場合のパフォーマンスへの影響は不明です。実行中のMySQLのバージョン(v5.0.24)でサポートされているかどうかが不明であるためです。 。

ヘルプは非常に評価されます

69
Timtom

float(10,6)は問題ありません。

他の複雑なストレージスキームでは、より多くの変換が必要になり、浮動小数点演算は非常に高速です。

29
richardtallent

MySQLについて質問していることは承知していますが、ビジネスにとって空間データが重要な場合は、再検討する必要があります。 PostgreSQL + PostGIS もフリーソフトウェアであり、空間および地理データを効率的に管理することで高い評価を得ています。多くの人々がPostGISのためだけにPostgreSQLを使用しています。

ただし、MySQL空間システムについてはあまり知らないので、ユースケースに十分対応できる可能性があります。

11
Jeff Davis

ここで「空間」以外のデータ型を使用する場合の問題は、「長方形の選択」の種類(通常、これはDBMSの明るさに依存します。MySQLは一般に最も明るいわけではありません)単一ディメンション。

システムは、経度インデックスまたは緯度インデックスのいずれかを選択し、それを使用して検査する行のセットを減らすことができます。しかし、それを行った後、(a)見つかったすべての行をフェッチし、それらをスキャンして「他のディメンション」をテストするか、(b)「他のディメンション」で同様のプロセスを実行してからこれら2つの結果セットを照合して、両方に表示される行を確認します。この後者のオプションは、特定のDBMSエンジンでは実装されていない場合があります。

空間インデックスは後者を「自動的に」行うので、空間インデックスはどのような場合でも最高のパフォーマンスを発揮すると言うのは安全だと思いますが、他のソリューションよりも大幅に優れていない場合もあります。わざわざ価値がないだけだ。これは、実際のデータの量や分布など、あらゆる種類のものに依存します。

確かに、フロート(ツリー)インデックスは、整数インデックスよりもフロートで '>'を実行するのに通常長い時間がかかるため、必然的に整数インデックスよりも遅くなります。しかし、この効果が実際に顕著である場合、私は驚かれるでしょう。

6
Erwin Smout

Googleは、「Store locator」の例でfloat(10,6)を使用しています。それで十分です。

https://stackoverflow.com/a/5994082/1094271

また、MySQL 5.6.xを開始すると、機能とパフォーマンスの点で、空間拡張のサポートがはるかに優れており、PostGISと同等です。

5
kouton

1/1,000,000度で表される整数(int、4バイト)として保存します。それはあなたに数インチの解像度を与えるでしょう。

MySQLには固有の空間データ型はないと思います。

5
ZZ Coder

フロート(10,6)

緯度または経度5555.123456はどこですか?

代わりにFloat(9,6)を意味しませんか?

4
Sally

私はこの答えが便利だと思いました、多分それもあなたを助けることができますか?: MySQLデータベースに緯度と経度の値を保存する問題

1
Elaine Marley

私はまったく同じスキーマ(float(10,6))とクエリ(四角形内で選択)を使用しており、dbエンジンをinnoDBからmyisamに切り替えると、テーブル内の「四角形の参照のポイント」の速度が2倍になることがわかりました780,000レコード。

さらに、すべてのlng/lat値をデカルト整数(x、y)に変換し、x、yに2列のインデックスを作成し、同じルックアップで速度が〜27ミリ秒から1.3ミリ秒になりました。

1
ow3n

データをどのように使用しているかによります。しかし、事実を大幅に単純化しすぎると、10進数は高速になりますが、近似の精度は低下します。詳細はこちら:

http://msdn.Microsoft.com/en-us/library/aa223970(SQL.80).aspx

また、GPS座標の標準はISO 6709で指定されています。

http://en.wikipedia.org/wiki/ISO_6709

0
AyexeM