У меня проблема с производительностью запросов, которые имеют order by
и group by
.Я проверил подобные проблемы на SO, но я не нашел решения этого: (
У меня есть что-то подобное в моей схеме БД: pattern
имеет много pattern_file
принадлежит project_template
, который принадлежитproject
Теперь я хочу получить projects
, отфильтрованный по некоторым данным (к дополнительным таблицам, к которым я присоединяюсь), и хочу получить результат, упорядоченный, например, по projects.priority
и сгруппированный по patterns.id
. У меня естьперепробовал много вещей и, чтобы получить желаемый результат, я вычислил этот запрос:
SELECT DISTINCT `projects`.* FROM `projects`
INNER JOIN `project_templates` ON `project_templates`.`project_id` = `projects`.`id`
INNER JOIN `pattern_files` ON `pattern_files`.`id` = `project_templates`.`pattern_file_id`
INNER JOIN `patterns` ON `patterns`.`id` = `pattern_files`.`pattern_id`
...[ truncated ]
INNER JOIN (SELECT DISTINCT projects.id FROM `projects` INNER JOIN `project_templates` ON `project_templates`.`project_id` = `projects`.`id`
INNER JOIN `pattern_files` ON `pattern_files`.`id` = `project_templates`.`pattern_file_id`
INNER JOIN `patterns` ON `patterns`.`id` = `pattern_files`.`pattern_id`
...[ truncated ]
WHERE [here my conditions] ORDER BY [here my order]) P
ON P.id = projects.id
WHERE [here my conditions]
GROUP BY patterns.id
ORDER BY [here my order]
Из моего исследования мне нужно INNER JOIN
с подзапросом, чтобы решить проблему "ORDER BY перед GROUPing BY" =>затем я поставил те же условия во внешний запрос для повышения производительности. order by
Я должен был использовать снова и во внешнем запросе, иначе результат будет отсортирован по умолчанию.
Теперь есть реальная производительностьпроблема, поскольку у меня есть около 6k projects
, и когда я запускаю этот запрос без каких-либо условий, это занимает около 15 с: / Когда я сужаю результат, указав условия, время резко упало.и где-то, что подзапрос выполняется для каждого внешнего результата строки запроса, который может быть истинным, когда вы смотрите во время выполнения: /
Не могли бы вы дать несколько советов, как я могу оптимизировать запрос?Я мало работаю с sql, так что, может быть, я делаю это с неправильной стороны с самого начала?
PS Я пробовал WHERE projects.id IN (выберите project.id ИЗ проектов ....) и чтоотменил проблему производительности, но также отменил ORDER BY перед группировкой BY
EDIT.
Я хочу получить список projects
, но я также хочу отфильтровать его и упорядочить, и, наконец, яхочу получить patterns.id уникальным (именно поэтому я использую группу by).
порядок в вашем внутреннем запросе (p) не имеет смысла (любая внутренняя сортировка будет иметь произвольныйэффект).
@ Solarflare К сожалению, это так.group by займет первый ряд из сгруппированного результата.Это сохранить порядок присоединения.Ну, я считаю, что это специфично для MySql.Кроме того, чтобы сохранить порядок из подзапроса, я мог бы использовать ORDER BY NULL
во внешнем запросе: -)
Кроме того, выберите проекты. * ... group by pattern.id подозрительно (хотя MySQL, напротив, наоборот)для всех остальных БД, позволяет вам сделать это)
, поэтому мы можем предположить, что я получаю только projects.id
, но из документов:
MySQL расширяет использование GROUPBY, чтобы разрешить выбор полей, которые не упомянуты в предложении GROUP BY