Оптимизация MySQL: выполнять математические операции внутри или вне запроса? - PullRequest
3 голосов
/ 02 марта 2011

У меня сильное чувство, что все математические операции, ненужные для самого запроса, должны быть выполнены вне запроса. Например:

$result = mysql_query(SELECT a, a*b/c as score FROM table)
while ($row = mysql_fetch_assoc($result))
{
    echo $row['a'].' score: '.$row['score'].<br>;
}

против

$result = mysql_query(SELECT a, b, c FROM table)
while ($row = mysql_fetch_assoc($result))
{
    echo $row['a'].' score: '.$row['a']*$row['b']/$row['c'].<br>;
}

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

Ответы [ 7 ]

1 голос
/ 02 марта 2011

Мне кажется, что выполнение математических операций в базе данных будет более эффективным в долгосрочной перспективе, учитывая настройку вашего запроса.В версии select a,b,c PHP должен создавать 3 элемента и заполнять их для каждой выбранной строки.

В версии в базе данных создаются только 2 элемента, поэтому вы сократили время создания на 33%,В любом случае, вычисления должны быть выполнены, поэтому экономия там невелика.

Теперь, если вам действительно нужно, чтобы значения b и c были представлены вашему коду, тогдане было бы никакого смысла делать вычисления в базе данных, вы бы добавили больше полей к результирующему набору с их сопутствующими издержками на создание / обработку / заполнение.

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

1 голос
/ 20 февраля 2015

Быстрее зависит от задействованных машин, если вы говорите быстрее для одного пользователя. Если вы говорите о том, что миллионы пользователей заходят на сайт быстрее, то эти вычисления более эффективны в PHP.

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

Из-за этого значение цикла ЦП на компьютере базы данных гораздо ценнее, чем на веб-сервере. Таким образом, вы должны выполнять эти математические функции на веб-сервере, где циклы ЦП дешевле и их значительно проще распараллелить.

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

1 голос
/ 02 марта 2011

Математика в запросе, как правило, не является проблемой, ЕСЛИ НЕ в предложении WHERE. Пример:

SELECT a, b, c FROM table WHERE a*b=c

Это делает практически невозможным использование индекса.

SELECT a*b/c FROM table

В порядке.

1 голос
/ 02 марта 2011

Я бы согласился в целом.Извлекайте данные из источника в вашем запросе, манипулируйте данными в среде вызовов / сценариев.

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

0 голосов
/ 04 февраля 2015

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

0 голосов
/ 02 марта 2011

Если есть какое-либо преимущество в производительности по сравнению с другим, скорее всего, оно будет весьма незначительным, что делает его скорее вопросом предпочтений, чем оптимизацией.

Я предпочитаю это в запросе лично, потому что чувствуюон инкапсулирует вычисления в уровне данных.

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

0 голосов
/ 02 марта 2011

Я сомневаюсь, что это может быть узким местом.
особенно со сложными объединениями таблиц и т. Д., Когда одна файловая сортировка будет выводить эти математические вычисления с коэффициентом 1000 с

Однако вы всегда можете разрешить запрос с ключевым словом BENCHMARKи сделать некоторые измерения

BENCHMARK 1000 SELECT a, a*b/c as score FROM table
...