2013-07-19 7 views
1

У меня есть таблица с 10 миллионами записей. Каждая запись указывает на одного человека. Каждая запись имеет person_id, широту, долготу, почтовый код. Я хочу выбрать один запрос и рассказать, сколько других людей в радиусе 10 миль (расстояние можно рассчитать по широтам и долготам). Поиск 10 миллионов записей и расчет расстояния для проверки, если внутри 10 миллионов не является хорошим способом. Итак, я буду искать только в соседних почтовых кодах (я как-нибудь его получу). Как я могу искать запись с определенным почтовым индексом (не все 10 миллионов записей)?search Большая таблица данных

ответ

1

Почему бы не взять lat/long и создать коробку, простирающуюся на 10 миль во всех четырех направлениях?

Затем произведите запрос, в котором ищут людей с длиною в этом поле. Используйте WHERE, что делает

x > xLess10 and x < xPlus10 and y > yLess10 and y < yPlus10 

Теперь у вас есть меньший список и вы можете рассчитать фактическое расстояние с чем-то подобным sqrt((x1 - x2)^2 + (y1 - y2)^2) для этого меньшего списка. Но он должен работать на сфере, а не на сетке, отмеченной в милях.

Вы можете попробовать добавить and zip in (555555, 555556, etc), чтобы узнать, работает ли это быстрее или нет. Предварительно вычисленный список всех других почтовых индексов с местоположениями в пределах 10 миль в любом месте почтового индекса будет довольно легко настроить в другой таблице.

@ Randy сделал комментарий, который заставило меня понять, что это не очень хорошо подходит для местоположений в радиусе 10 миль от северных и южных полюсов. Может быть, это неважно, потому что население там довольно мало. Или используйте другой метод, чтобы просто собрать всех в пределах перила вокруг полюса и в 10 милях к югу (или северу) или к месту x, y.

Кроме того, вы должны найти способ конвертировать из лат/long в мили. Продольные линии сближаются, чем дальше вы от экватора.

+1

или, может быть, неплохо было бы оставить коробку в качестве приближения для «близости» - следите, чтобы ваше круговое уравнение не совсем правильно для БОЛЬШОГО КРУГА. – Randy

 Смежные вопросы

  • Нет связанных вопросов^_^