- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Все что нужно знать о DDоS-атаках грамотному менеджеру
И как реагировать на "пожар", когда неизвестно, где хранятся "огнетушители
Антон Никонов
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Нужно выбирать ближайшие объекты по заданным координатам из базы (100к записей).
Особая точность не нужна, можно выбирать из прямоугольника с диагональю двойного растояния поиска (на окружность ресурсы тратить не стоит)
Лучшее что удалось найти: это
Там предлагает два варианта:
1. использовать процедуру, которая, ограничивает прямоугольник поиска и выбирает between координат.
2. использовать spatial функции, которые по своей сути делают тоже самое.
Т.е. выбрать объекты вроде как не состовляет сложности, но если в квадрате будет их много (скажем 10к) мне кажется будет долго order by distance..
У кого есть опыт?
Ничего долгого, если у вас место по сути не ограничено. Создайте кэш для каждого объекта и не нужно каждый раз делать поиск.
Создайте кэш для каждого объекта и не нужно каждый раз делать поиск.
А что кэшировать? distance-то от объекта до произвольной координаты изменяется..
мне кажется будет долго order by distance
Если действительно будет - тогда думать..
Если не критичны незначительные ошибки при сортировке, можно другой, менее ресурсоёмкой метрикой пользоваться.. (к примеру, |x1-x2|+|y1-y2|)
В свое время сталкивался с похожей задачей когда нужно было выводить обьекты недвижимости на Яндекс картах.
Определяли местоположение объекта
longitude – float
$leftx , $lefty - левый нижний угол
$rightx, $righty – правый верхний угол
Зная точку вокруг которой нужно искать очень легко в пхп построчить верхний и нижний угол
дальше на основе этих данных строился SQL запрос
Запрос очень простой БАЗА была MySQL записей ~ 1M, но в выборке участвовали максимум 100 тыщ. Естественно latitude, longitude добавили в индекс, так как это числа то запрос довольно быстро отрабатывал и не создавал нагрузку.(тупо в лоб, без красивостей - но оно работало!!!!)
Самый геморрой начался когда выбиралась область а в ней от 5 до 30 тысяч объектов . А на карту одновременно мы выводили не более 500 объектов. Вариант когда тупо стоит LIMIT 0,500; отмели сразу. Задача стояла выводить рендомно каждый раз объекты для это области т.е чтобы не было такого что показываются одни и те же 500 последних. Пробовали order by RAND() LIMIT 0,500 -- запрос начал жрать кучу ресурсов и тормозить.
В итоге сделали костыльное решение во все записи добавили 10 новых полей RAND1, RAND….RAND10. Все эти поля заполнялись при вставке записи в базу каждое поле получало свое рендомное значение от 1 до 1000. А когда в пхп строился запрос на выборку то случайным образом выбиралось 1 поле из 10 по которому будут сортироваться этот раз записи. Решение конечно довольно колхозное – но стабильно работало. И когда единицей поиска был целый город разные люди при заходах получали разные наборы выборок.
Использую комбинированный вариант.
1) Выделение максимальных/минимальных координат на нужном расстоянии от заданной точки и фильтр всех точек, которые попадают в эту область.
2) Среди них уже расчет точного расстояния до начальной точки и сортировка по этому значению.
Проблем с производительностью замечено не было. У меня в этот прямоугольник обычно может попадать до 2к точек пока. Работающий пример
Для первого этапа граничные значения расчитываются вот так:
Дальше эти значения просто в WHERE добавляются в запрос. С использованием ORM у меня так, но думаю, смысл понятен:
Использую встроенную процедуру для определения расстояния на втором этапе. По результату и делаю сортировку.
Пример расчета расстояния от точки А с координатами lat1, lon1 до точки B c координатами lat2 : GetDistance(lat1,lon1,lat2,lon2);
Если что-то не понятно описал, обращайтесь, расскажу.