Что быстрее: обработать данные внутри PHP или сделать несколько запросов MySQL?

#php #mysql

#php #mysql

Вопрос:

Мне нужно обработать несколько обширных данных: очень большую таблицу в MySQL. Обработка выполняется три раза. Прямо сейчас я делаю один запрос к MySQL, а затем в PHP я запускаю while цикл три раза, чтобы извлечь необходимые значения.

Является ли то, что я сейчас делаю, лучшим вариантом, или потребуется меньше ресурсов сервера для выполнения трех отдельных запросов к MySQL с определенными фильтрами?

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

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

2. Вам нужно немного уточнить, чтобы мы могли дать правильный ответ. Есть много факторов, которые могут изменить подход. Одним из решений часто является «изменение database engine» при работе с большими наборами данных. Материал, с которым я работаю изо дня в день, обычно находится на уровне, о котором вы можете забыть, используя RDBMS. Опишите проблему лучше, и мы сможем посоветовать инструменты и угол атаки.

3. Реализуйте оба. Измерьте оба. Оптимизируйте оба. Измерьте оба еще раз. Решайте.

Ответ №1:

Используйте MySQL как можно больше в этой ситуации. Потенциально это намного быстрее.

РЕДАКТИРОВАТЬ: Как любезно указано ниже, не всегда лучше использовать SQL-запросы вместо обработки в PHP, и поэтому приведенное выше утверждение может вводить в заблуждение.

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

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

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

1. Это не обязательно так. Скажем, если вы неправильно используете индексы, это может быть медленнее, конечно, есть и другие факторы. Но я бы сказал, что это немного амбициозное предложение.

2. @James Да, но я сделал некоторые предположения о том, что он делает с данными, исходя из формулировки его вопроса. Мне кажется, что он только выбирает определенные значения из таблицы, не обрабатывая значения заранее. Оператор MySQL Select, даже сложный, скорее всего, будет намного быстрее, чем использование PHP (который, вероятно, довольно часто использует циклы и ifs). Кроме того, если эти инструкции используются довольно часто, то индексация и кэширование, которые MySQL будет выполнять автоматически, значительно увеличат скорость запросов, чего вообще не произойдет только в PHP

3. Извините, но это неправда. Есть много вещей, в которых MySQL хорош, но есть случаи, когда вы хотели бы выполнять обработку вне базы данных. Все зависит от проблемной области. Я видел и работал со случаями, когда даже хорошо настроенная схема, запросы и mysql-сервер тратят больше времени на выполнение запроса, чем «передача всех строк по сети» «обработка в коде».

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