Оптимизация MySQL ORDER BY на расчете, используемом совместно с WHERE - PullRequest
1 голос
/ 15 ноября 2010

У меня есть запрос MySQL SELECT, который вычисляет расстояние с помощью Pythagoras в предложении WHERE, чтобы ограничить результаты определенным радиусом.

Я также использую точно такие же вычисления в предложении ORDER BY, чтобы отсортироватьсначала наименьшее расстояние.

Рассчитывает ли MySQL расстояние дважды (один раз для WHERE и снова для ORDER BY)?

Если это так, как я могу оптимизировать запрос, чтобы он был толькорассчитывается один раз (если вообще возможно)?

Ответы [ 2 ]

3 голосов
/ 15 ноября 2010

MySQL вычисляет расстояние дважды (один раз для WHERE и снова для ORDER BY)?

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

Я бы порекомендовал изменить базу данных, чтобы использовать тип геометрии и создать пространственный индекс . на ваших данных.Затем вы можете использовать MBR с , чтобы быстро найти точки, которые находятся внутри ограничительной рамки вашего круга.После того, как вы нашли эти точки, вы можете провести более дорогой дистанционный тест только по этим точкам.Этот подход будет значительно быстрее, если ваша таблица будет большой, а типичный поиск возвращает только небольшую часть строк.

Если вы не можете изменить модель данных, вы все равно можете улучшить производительность, используя ограничивающиеСначала отметьте флажок, например WHERE x BETWEEN 10 AND 20 AND y BETWEEN 50 AND 60.Ограничивающий флажок сможет использовать индекс, но поскольку индексы R-Tree поддерживаются только для геометрического типа, вам придется использовать стандартный индекс B-Tree, который не столь эффективен для этого типа запроса (но все же оченьлучше чем то, что ты сейчас делаешь).

1 голос
/ 15 ноября 2010

Вы можете выбрать его, поместить его в предложение HAVING и использовать его в предложении ORDER BY, тогда вычисление, безусловно, выполняется только один раз, но я полагаю, что это будет медленнее, поскольку он должен работать с большим количеством данных.,Сам расчет не так уж и дорог.

...