パフォーマンスに関する質問...
位置情報データ(経度と緯度)を持つ家のデータベースがあります。
私がしたいのは、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
更新:未回答
以下に3つの異なる回答があります。ある人はFloat
を使用すると言います。ある人はINT
を使用すると言います。ある人はSpatial
を使用すると言います。
そこで、MySQLの「EXPLAIN」ステートメントを使用して、SQL実行速度を測定しました。経度と緯度のデータ型にINT
またはFLOAT
を使用する場合、SQL実行(結果セットのフェッチ)に違いはまったくないようです。
また、「BETWEEN
」ステートメントを使用すると、「>
」または「<
」SQLステートメントを使用するよりも大幅に高速になるようです。 「>
」および「<
」ステートメントを使用するよりも、「BETWEEN
」を使用する方がほぼ3倍高速です。
そうは言っても、Spatialを使用した場合のパフォーマンスへの影響は不明です。実行中のMySQLのバージョン(v5.0.24)でサポートされているかどうかが不明であるためです。 。
ヘルプは非常に評価されます
float(10,6)は問題ありません。
他の複雑なストレージスキームでは、より多くの変換が必要になり、浮動小数点演算は非常に高速です。
MySQLについて質問していることは承知していますが、ビジネスにとって空間データが重要な場合は、再検討する必要があります。 PostgreSQL + PostGIS もフリーソフトウェアであり、空間および地理データを効率的に管理することで高い評価を得ています。多くの人々がPostGISのためだけにPostgreSQLを使用しています。
ただし、MySQL空間システムについてはあまり知らないので、ユースケースに十分対応できる可能性があります。
ここで「空間」以外のデータ型を使用する場合の問題は、「長方形の選択」の種類(通常、これはDBMSの明るさに依存します。MySQLは一般に最も明るいわけではありません)単一ディメンション。
システムは、経度インデックスまたは緯度インデックスのいずれかを選択し、それを使用して検査する行のセットを減らすことができます。しかし、それを行った後、(a)見つかったすべての行をフェッチし、それらをスキャンして「他のディメンション」をテストするか、(b)「他のディメンション」で同様のプロセスを実行してからこれら2つの結果セットを照合して、両方に表示される行を確認します。この後者のオプションは、特定のDBMSエンジンでは実装されていない場合があります。
空間インデックスは後者を「自動的に」行うので、空間インデックスはどのような場合でも最高のパフォーマンスを発揮すると言うのは安全だと思いますが、他のソリューションよりも大幅に優れていない場合もあります。わざわざ価値がないだけだ。これは、実際のデータの量や分布など、あらゆる種類のものに依存します。
確かに、フロート(ツリー)インデックスは、整数インデックスよりもフロートで '>'を実行するのに通常長い時間がかかるため、必然的に整数インデックスよりも遅くなります。しかし、この効果が実際に顕著である場合、私は驚かれるでしょう。
Googleは、「Store locator」の例でfloat(10,6)を使用しています。それで十分です。
https://stackoverflow.com/a/5994082/1094271
また、MySQL 5.6.xを開始すると、機能とパフォーマンスの点で、空間拡張のサポートがはるかに優れており、PostGISと同等です。
1/1,000,000度で表される整数(int
、4バイト)として保存します。それはあなたに数インチの解像度を与えるでしょう。
MySQLには固有の空間データ型はないと思います。
フロート(10,6)
緯度または経度5555.123456はどこですか?
代わりにFloat(9,6)を意味しませんか?
私はこの答えが便利だと思いました、多分それもあなたを助けることができますか?: MySQLデータベースに緯度と経度の値を保存する問題
私はまったく同じスキーマ(float(10,6))とクエリ(四角形内で選択)を使用しており、dbエンジンをinnoDBからmyisamに切り替えると、テーブル内の「四角形の参照のポイント」の速度が2倍になることがわかりました780,000レコード。
さらに、すべてのlng/lat値をデカルト整数(x、y)に変換し、x、yに2列のインデックスを作成し、同じルックアップで速度が〜27ミリ秒から1.3ミリ秒になりました。
データをどのように使用しているかによります。しかし、事実を大幅に単純化しすぎると、10進数は高速になりますが、近似の精度は低下します。詳細はこちら:
http://msdn.Microsoft.com/en-us/library/aa223970(SQL.80).aspx
また、GPS座標の標準はISO 6709で指定されています。