Съжаляваме, но това не е 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 или комуникация извън кутията)
Надявам се това да помогне.