我正试图从我的桌子上获得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);
虽然我真的不知道如何正确使用它。你能帮我吗?
答案 0 :(得分: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
答案 1 :(得分:0)
我过去曾使用great circle equation进行这些类型的计算。我不确定性能如何比较,但可能值得尝试和比较。
Here是一个很好的SO帖子,它将讨论如何在MySQL中完成它。
答案 2 :(得分:-1)