Я думаю, что ваша проблема сложнее традиционной проблемы из-за переменной радиуса.
См. http://mysql.rjweb.org/doc.php/find_nearest_in_mysql для обсуждения.
В этом списке 5 способов msgstr "найти ближайший X". Самый простой, но самый медленный, это проверить каждый предмет на предмет его расстояния. Все остальное происходит быстрее благодаря использованию «ограничительной рамки» для ограничения количества проверяемых элементов. Однако кодирование становится сложным.
Ограничительная рамка, в вашем случае, может быть ограничена максимальным радиусом в таблице. Ваши выборочные данные показывают радиусы до 8, поэтому построение квадрата со стороной 2 * 8 вокруг начальной точки позволит вам использовать различные методы, которые я описываю.
Самое простое включает INDEX(lat, lng), INDEX(lng, lat)
, чтобы позволить оптимизатору выбрать что лучше. Преимущество состоит в том, что он проверяет только элементы шириной 16 (широта или долгота), а не весь земной шар. Недостаток в том, что он не слишком оптимизирует другое направление.
Я предлагаю вам использовать эту технику в качестве первого среза. Если вам нужно больше производительности, читайте дальше в моем документе и, оптимально, возвращайтесь за дополнительной помощью,
Методы, обсуждаемые там, также позволяют ограничить количество возвращаемых значений.