Извините, но это не ответ SQL, а способ получения предсказуемой производительности с учетом определенных ограничений ваших данных.
Как часто данные меняются? Если возможно, не могли бы вы предварительно рассчитать график каждого объекта 5 ближайших соседей и использовать его для ускорения вашего выбора .?
Если эти данные в основном только для чтения, то ...
Насколько равномерно распределены эти точки? Если распределение достаточно равномерно и хорошо известно, то вы могли бы развернуть свое собственное пространственное отображение, поместив все координаты и индексы в хеш-таблицу.
Если вам не нужно хранить данные в базе данных, переместите их в файл с отображением в памяти для быстрого поиска хеша. (70м записи должны легко помещаться в памяти).
Я использую эту архитектуру для генерации поисков менее миллисекунды для отображения рекламы и релевантности поисковой системы.
== Разработка ==
Вы просто создаете сетку квадратов фиксированного размера (например, шахматную доску), и вы отображаете каждую точку в сетке, и вы создаете список объектов, которые принадлежат каждому из полей сетки - если вы настраиваете размер каждой ячейки должен составлять в среднем 5–50 точек на каждом квадрате. В принципе, это четырехугольное дерево, но без дерева для простоты.
Для каждого сегмента, который пуст после того, как вы разбросали все данные в сегментах, вы добавляете информацию о ближайших сегментах, содержащих данные.
Теперь вы можете нумеровать каждую группу слева-направо-строку-строку, чтобы каждый сегмент имел уникальный номер, который можно вычислить по координатам, и вы вставляете каждую группу в хеш-таблицу или, если пробел, разрешив так же, как прямую таблицу поиска.
Теперь, когда у вас есть запрос, вы просто вычисляете, к какому контейнеру он будет привязан, и вы получите либо список объектов в этом сегменте, либо вы получите «пустой» блок, содержащий указатели на ближайший блок. которые имеют содержание.
Это даст вам первый список кандидатов объектов, которые вы ищете, и теперь вам просто нужно просто запустить и посмотреть, какой из них ближе всего.
В 99% случаев это так и есть - но если вас это беспокоит, то (а) либо есть несколько единомышленников в соседних корзинах, которые на самом деле ближе, то просто проверьте 8 окружающих корзин и посмотрите, если найдешь там поближе.
Если теперь вы также хотите получить список всех ближайших объектов, то также рассчитайте простую сеть из 5 ближайших соседей для каждого объекта, так что вы получите структуру данных, подобную A -> {B, C, D, E, F}, B -> {A, D, G, H, I}, C -> {A, J, K, G, M} ....
Это сформирует простую сеть, которую вы теперь можете проходить с вариацией Dijkstra здесь, чтобы получить все точки, смежные с вашей ближайшей точкой.
Построение структур данных потребует времени, но после того, как все сделано, и правильный поиск и возврат набора данных может быть выполнен за миллисекунды (не включая http или автономную связь по причине)
Надеюсь, это поможет.