MySql: упорядочить вместе с группой по производительности - PullRequest
0 голосов
/ 23 января 2019

У меня проблема с производительностью запросов, которые имеют 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

...