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

我过去曾使用大圆方程来进行这些类型的计算。我不确定性能如何比较,但可能值得尝试和比较。

是一篇很好的 SO 帖子,介绍了如何在 MySQL 中执行此操作。

于 2010-06-21T16:28:15.167 回答
-1

看看这些问题:

于 2010-06-21T17:00:19.763 回答