Bạn nên lưu trữ các điểm trong một cột đơn của loại dữ liệu Point
mà bạn có thể lập chỉ mục bằng SPATIAL
chỉ mục (nếu loại bảng của bạn là 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
Điều này sẽ cải thiện đáng kể tốc độ của các truy vấn như "tìm tất cả trong một bán kính nhất định".
Lưu ý rằng tốt hơn nên sử dụng TM
đơn giản tọa độ metrical (mở rộng và đông bắc) thay vì cực (vĩ độ và kinh độ). Đối với các bán kính nhỏ, chúng đủ chính xác và các phép tính được đơn giản hóa rất nhiều. Nếu tất cả các điểm của bạn nằm trong một hemishpere và ở xa các cực, bạn có thể sử dụng một kinh tuyến trung tâm duy nhất.
Tất nhiên, bạn vẫn có thể sử dụng tọa độ cực, nhưng các công thức để tính toán MBR
và khoảng cách sẽ phức tạp hơn.