您应该将点存储在数据类型Point的一个列中,您可以使用空间索引(如果您的表格类型为MyISAM)进行索引,则可以:
CREATE SPATIAL INDEX sx_place_location ON place (location)
SELECT *
FROM mytable
WHERE MBRContains
(
LineString
(
Point($x - $radius, $y - $radius),
Point($x + $radius, $y + $radius)
)
location
)
AND Distance(Point($x, $y), location) <= $radius
这将大大提高查询的速度,例如“在所有范围内找到所有内容”.
请注意,最好使用普通TM测量坐标(东,北),而不是极坐标(纬度和纬度).对于小半径,它们是足够准确的,并且计算被大大简化.如果你所有的分数都在一个半点,远离极点,你可以使用单个中心子午线.
您当然可以使用极坐标,但用于计算MBR和距离的公式将更为复杂.