Какой из них было бы безопаснее / лучше запускать?

#mysql #optimization #distance

#mysql #оптимизация #расстояние

Вопрос:

У меня есть 451 город с координатами. Теперь я хочу рассчитать расстояние между каждым городом, а затем упорядочить некоторые результаты по этому расстоянию. Теперь у меня есть 2 варианта:

  1. Я могу запустить цикл, который будет вычислять расстояние для каждой возможной комбинации городов и сохранять их в таблице, что приведет к примерно 200 тыс. строк.
  2. Или я могу оставить города без предварительного вычисления, а затем, когда будут отображены результаты (около 30 на страницу), рассчитать расстояние для каждого города отдельно.

Я не знаю, что было бы лучше для производительности, но я бы предпочел выбрать первый вариант, и в этом случае у меня есть другая проблема: есть ли способ вывести как можно меньше строк? В настоящее время я бы посчитал возможности как 451^2 , но я думаю, что мог бы разделить это на 2, поскольку расстояние в случае City1-City2 совпадает с City2-City1 .

Спасибо

Комментарии:

1. Если вы хотите знать, какой из них работает лучше, попробуйте. Придумайте образцы данных и некоторые запросы, которые вы можете выполнить, и попробуйте их для каждого из ваших вариантов. Намного лучше, чем гадать.

2. Я не пытаюсь угадать. Я просто пытаюсь выяснить, доказано ли, что какой-либо из них работает быстрее / требует меньше нагрузки.

3. Я понимаю. Хотя, судя по вашей проблеме, оба должны быть достаточно быстрыми в реализации. Однако, если список городов статичен, ответ @Ivan имеет смысл.

Ответ №1:

Если ваша таблица городов более или менее статична, то вам обязательно следует рассчитать все расстояния и сохранить их в отдельной таблице. В этом случае у вас будет (451 ^ 2/2) строк (просто убедитесь, что идентификатор City1 всегда ниже идентификатора City2 (или наоборот, на самом деле не имеет значения)).

Ответ №2:

Обычно стоимость одного запроса MySQL довольно высока, а стоимость математических операций действительно низкая. Особенно, если масштаб вашей карты мал, а требуемая точность низкая, поэтому вы можете вычислять с фиксированным расстоянием между градусами, вы будете быстрее вычислять.

Кроме того, у вас возникнет проблема, если количество городов увеличится из-за изменений в вашем проекте, и, следовательно, количество комбинаций, которые вам придется хранить в БД, превысит лимиты.

Так что вам, вероятно, лучше обойтись без предварительных вычислений.

Комментарии:

1. MySQL не накладывает искусственных ограничений на размеры таблиц, поэтому количество комбинаций не будет проблемой. Кроме того, кажется, что OP просто хочет возвращать записи на основе расстояния, что было бы тривиально для базы данных (пример: сортировка по возрастанию расстояния, ограничение 5). Наконец, координаты города не меняются регулярно, поэтому предварительное вычисление расстояния фактически сэкономит время обработки в долгосрочной перспективе. Точность может быть исправлена в MySQL. Поскольку OP в любом случае будет выполнять SQL-запросы, стоимость SQL-запроса на самом деле не является существенной проблемой.