поиск по долготе с mysql с пространственным

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

Пока у меня это...

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 секунды. Есть ли способ оптимизировать этот запрос, так как я беспокоюсь, что по мере роста базы данных этот запрос будет медленнее...


person user984314    schedule 12.03.2012    source источник
comment
Посмотрите на этот вопрос stackoverflow.com/questions/ 1006654/   -  person Vadim Baryshev    schedule 13.03.2012


Ответы (2)


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

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

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

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

person D Mac    schedule 14.03.2012

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

person user1931858    schedule 06.09.2013