2012-03-12 4 views
0

Использование mysql db. У меня есть столбец «latlong», который является точечным типом с пространственным индексом. Я хотел бы получить самые близкие местоположения в 4 милях ближе к широте и долготе.поиск long long с mysql с пространственными

До сих пор у меня есть это ...

SELECT `postcode`,county, (3959 * acos(cos(radians(51.585738)) * cos(radians(x(GeomFromText(astext(latlong))))) * cos(radians(y(GeomFromText(astext(latlong)))) - radians(-0.260878)) + sin(radians(51.585738)) * sin(radians(x(GeomFromText(astext(latlong))))))) AS distance 
FROM uk_p HAVING distance < 4 ORDER BY distance LIMIT 0 , 20 

У меня есть только 2900 записей, и она занимает около 0,0277 сек. Есть ли способ оптимизировать этот запрос, так как я обеспокоен тем, что по мере роста базы данных медленнее будет этот запрос ...

+0

Посмотрите на этот вопрос http://stackoverflow.com/questions/1006654/fastest-distance-lookup-given-latitude-longitude –

ответ

0

Вы можете воспользоваться одним из двух подходов: одним из них является предварительное вычисление конверсий радиан и триггер функции и сохранять результаты в новых столбцах в вашей таблице - это избавит вас от выполнения какой-либо работы, которая не изменяется для каждого почтового кода. Вам все равно придется рассчитать расстояние до вашей цели, и вы ничего не можете с этим поделать, так как вы, вероятно, хотите, чтобы он работал с любой произвольной целью.

Другой подход должен быть менее точным. Если вы работаете с достаточно маленькой областью, которая не находится рядом с одним из полюсов, вы можете предположить, что мир плоский (серьезно) и использует декартовую координатную математику вместо сферического триггера.

Или, чтобы объединить два подхода, вы могли бы сделать однократное отображение всех ваших почтовых кодов в прямолинейную сетку и надеяться, что это приближение будет достаточно для ваших целей. Это будет работать лучше всего, если вы имеете дело с относительно небольшой географической областью.

Другими словами, вам не нужно общее решение (которое вы используете сейчас), если вы можете сделать некоторые предположения о вашем конкретном домене.

0

Вы запросили штраф за 2900 записей. Для большого набора данных вы можете использовать запросы диапазона с ограничивающей рамкой, окружающей центр. См. Ответ в this question.

Смежные вопросы