У нас есть хранимая процедура MySQL, которая принимает входные данные в виде широты и долготы. Эта хранимая процедура должна вернуть обратно 3 ближайших области к этому широте / длине и соответствующее расстояние в километрах от заданного широты / длины.
Таблица области имеет идентификатор, имя, позицию. Позиция точечного типа, имеющая POINT (широта, долгота). Я пробовал следующее решение:
SELECT
id,
name,
X(position) AS 'latitude',
Y(position) AS 'longitude',
(
GLength(
LineStringFromWKB(
LineString(
position,
GeomFromText('POINT(@lat @long)')
)
)
)
)
AS distance
FROM areas
ORDER BY distance ASC
limit 3;
Несколько проблем в приведенном выше решении:
- Запрос медленный. Это займет 200 миллисекунд для 22k записей. Если я уберу порядок по предложению, производительность резко улучшится, т. Е. Это займет всего 20 миллисекунд. Я создал пространственный индекс для столбца позиции, но не помог. Может кто-нибудь подсказать, как оптимизировать этот запрос?
- Я не уверен, как перевести это расстояние в километры?
Вот снимок экрана с описанным выше оператором select:
![enter image description here](https://i.stack.imgur.com/uJ0vL.png)