空間クエリを最適化: 5 マイル以内のすべての建物を効率的に検索
この記事では、指定された座標点から指定された半径内にあるすべての建物を取得するという、一般的な空間問題について説明します。 ST_CONTAINS
関数を直接使用するのは効率的ではない可能性があるため、この記事ではより良い解決策を検討します。
データ表現の重要性
技術的な詳細に入る前に、正しいデータ表現の重要性を強調することが重要です。地理空間データを経度と緯度の別個の列として保存すると、クエリ操作が非効率になります。この目的のために、2 つの座標を 1 つのフィールドにカプセル化する geometry
または geography
データ型を使用することを強くお勧めします。
ST_DWithin を使用して近接クエリを効率的に実行します
ST_DWithin
は、2 つのジオメトリが指定された距離内にあるかどうかを直接チェックする強力な関数です。 探索半径をメートルに変換し、ST_DWithin
を使用して計算された距離と比較することで、目的の範囲内の建物を効率的に特定できます。
<code class="language-sql">SELECT name, long, lat FROM building WHERE ST_DWithin( ST_GEOMETRY_FROM_TEXT('POINT(-84.38653999999998,33.72024)'), ST_POINT(long, lat), 8046.72 ); -- 8046.72 米 = 5 英里</code>
換算されたマイル距離を処理するには ST_Distance を使用します
または、ST_Distance
を使用して幾何学的形状間の距離を計算することもできます。出力は最初はメートル単位ですが、単純な乗算係数を使用してマイルに変換できます:
<code class="language-sql">SELECT name, long, lat, ST_Distance( ST_GEOMETRY_FROM_TEXT('POINT(-84.38653999999998,33.72024)'), ST_POINT(long, lat) ) * 0.000621371 AS distance FROM building WHERE distance < 5;</code>
注: ST_Distance
を使用する場合、インデックスを使用して空間クエリを効率的に処理する必要があります。 ST_Distance
自体はインデックス作成をサポートしていませんが、ST_GEOMETRY
に空間インデックスを作成すると全体的なクエリのパフォーマンスを最適化できます。
概要
代替アプローチを検討し、データ表現の最適化に重点を置くことで、指定された範囲内の建物を効率的に取得する方法を実証します。このホワイトペーパーで紹介する手法は、実際のアプリケーションにおける空間クエリのスケーラビリティとパフォーマンスの向上を実現します。
以上が指定された地点から 5 マイル以内のすべての建物を効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。