Я запускаю задачу cron, которая делает много запросов на сервере MySQL
. Большая проблема заключается в том, что сервер работает очень медленно.
У меня есть относительно большой запрос с четырьмя столами слева, соединенными между ними, и 4 меньшими запросами с natural join
которые также атакуют первую таблицу. Выбрав эти запросы, я обрабатываю результаты и группирую их с помощью PHP
.
Я планирую как-то смешать эти 5 запросов в один большой запрос, а затем позволить PHP
сделать некоторые быстрые sort()
когда мне это нужно.
Мне также говорят, что запросы MySQL
выполняются быстрее PHP
с точки зрения фильтрации и сортировки, но я достаточно обеспокоен этим, когда говорю о наличии 7 или 8 левых объединений. Некоторые дополнительные сведения об этих запросах (которые я не могу скопировать из-за политики компании):
GROUP BY
. PHP
разбивает некоторые вторичные запросы на несколько массивов. При использовании большого запроса он должен также сортировать результаты по нескольким параметрам. Таким образом, из-за этих проблем и, возможно, как правило:
Что происходит быстрее, большой объединенный запрос с большим количеством PHP или несколькими небольшими выборками с меньшим количеством PHP?
Как правило, чем меньше запросов, тем лучше. Есть накладные расходы на передачу запроса в MySQL, однако сложный запрос. Однако php неожиданно быстро для некоторых вещей, и если вы не используете индексы для сортировки (что кажется возможным, если вы эффективно сортируете результаты нескольких запросов, объединенных вместе), производительность рода в php может быть сопоставима или даже лучше ,
Там, где есть большая разница, вы получаете результаты одного запроса, а затем выполняете другой запрос для каждой возвращаемой строки в первом запросе. В этой ситуации довольно легко, что количество запросов выходит из строя довольно быстро, не будучи замеченным. На работе я нашел сценарий генерации меню, у которого был один запрос, чтобы получить пункты меню высокого уровня, а затем еще один запрос для каждого элемента высокого уровня, чтобы получить элементы детского меню. Это было легко переписано как объединение, но удивительной частью является разность рабочих характеристик, с тем временем, которое требуется для того, чтобы сгенерировать меню с 0,2 секунды до 0,002 секунды.
Но это случайное решение. У меня было требование вернуть некоторые значения на основе рассчитанного значения levenshtein (по существу, оценка того, как разные 2 строки). Используя пользовательскую функцию mysql, это было возможно и значительно уменьшило количество возвращенных строк, но было довольно медленным. Функция php levenshtein значительно быстрее, и оказалось более эффективным возвращать в несколько раз больше строк, а затем обрабатывать их в php для получения значения levenshtein и затем отбрасывать ненужные записи.
В описанной ситуации я подозреваю, что разница может быть незначительной. Казалось бы, вы будете делать только 4 запроса, а не более 1 сложный запрос. Однако, не видя структуры таблиц и запросы (которые, к сожалению, вы не можете предоставить), трудно быть уверенным. Возможно, было бы эффективно сделать один разумный сложный запрос, но игнорировать сортировку, где это не является строго необходимым, а затем выполнить это в php (для этого полезно использовать сопоставление с определенным пользователем).
Еще одна проблема заключается в том, что сложный запрос сложнее поддерживать. Хотя есть много людей, которые могут склеить сценарий php вместе или могут понять простой SQL-запрос, число, которое может понимать сложные SQL-запросы, вызывает беспокойство.
По моему опыту SQL запросы быстрее. Я также использую множество таблиц в некоторых своих приложениях и обнаружил, что использование простых запросов и сбор наборов данных в PHP медленнее, а производительность действительно улучшена, если вы поместите все на стороне SQL.