Я тут вижу костылик, если вы ограничены в области выборки, то часть вопросов можно снять проиндексировав поля `longitude`, `latitude` и пред ST_Distance_Sphere делать WHERE BETWEEN `longitude`, BETWEEN `latitude`. И ограничить поле рассчитывая необхордимое количество градусов в одном градусе меридиана 111 км, а с параллелями надо мудрить в зависимости от широты. Вот код из примеров, немного криво, но работает и индексы использует:
SELECT
id
FROM
table
WHERE latitude BETWEEN 50 AND 60
AND longitude BETWEEN 35 AND 45
AND
(
ST_Distance_Sphere(
point(latitude, longitude),
point(55.741983, 37.638983)
)
) <= 10000
Таким образом можно ограничить область выборки условным квадратом 1000х1000 км, что отсечет не подходящие координаты и ускорит выполнение запроса. Или думать в сторону PosgreSQL