5

特定のポイントまでの距離が最も短いテーブルから100ポイントを取得しようとしています。

使っています

SELECT *, GLENGTH(
            LINESTRINGFROMWKB(
              LINESTRING(
                ASBINARY(
                  POINTFROMTEXT("POINT(40.4495 -79.988)")
                ),
                ASBINARY(pt)
              )
            )
          )
 AS `distance` FROM `ip_group_city` ORDER BY distance LIMIT 100

(ええ、それは苦痛です。私はそれをグーグルで検索しました。MySQLで距離を正しく測定する方法がわかりません)

実行には非常に長い時間がかかります。EXPLAINはないと言いpossible_keysます。

列にSPATIALインデックスを作成しました。pt

CREATE SPATIAL INDEX sp_index ON  ip_group_city (pt);

正しく使う方法はよくわかりませんが。手伝ってくれませんか?

4

3 に答える 3

6

WHERE句がないため、影響を受けるインデックスはありません。MBR_(MySQL 5.0以降)またはST_関数(MySQL 5.6以降)を使用して追加することにより、このクエリを改善する必要があると思います。何かのようなもの:

SELECT *, GLENGTH(
            LINESTRINGFROMWKB(
              LINESTRING(
                ASBINARY(
                  POINTFROMTEXT("POINT(40.4495 -79.988)")
                ),
                ASBINARY(pt)
              )
            )
          )
 AS `distance` 
FROM `ip_group_city` 
WHERE
MBRWithin(
        pt, -- your point
        GeomFromText('Polygon( -- your line (in polygon format) from pt to target point 
                        (
                            #{bound.ne.lat} #{bound.ne.lng}, --North East Lat - North East Long
                            #{bound.ne.lat} #{bound.sw.lng}, --North East Lat - South West Long
                            #{bound.sw.lat} #{bound.sw.lng}, --
                            #{bound.sw.lat} #{bound.ne.lng},
                            #{bound.ne.lat} #{bound.ne.lng}
                        )
                    )')
      )
ORDER BY distance LIMIT 100
于 2012-12-03T04:51:59.463 に答える
0

私は過去にこれらのタイプの計算を行うために大円方程式を使用しました。パフォーマンスがどのように比較されるかはわかりませんが、試して比較する価値があるかもしれません。

これは、 MySQLでそれを行う方法を説明する優れたSO投稿です。

于 2010-06-21T16:28:15.167 に答える
-1

これらの質問を見てください:

于 2010-06-21T17:00:19.763 に答える