MySQL Несколько подзапросов по сравнению с целыми запросами

Мне интересно, какой способ получить данные из базы данных MySQL имеет лучшие характеристики производительности.

Использование подзапросов в одном основном запросе:

SELECT (SELECT SUM(`number`) FROM `table`) as `number_sum`, (SELECT MAX(`number`) FROM `table`) as `number_max`, (SELECT MIN(`number`) FROM `table`) as `number_min` 

Или 3 различных SELECT извлекающих одни и те же данные.

Заранее спасибо!

Поскольку эти три агрегата поступают из одной таблицы с теми же условиями WHERE , вам не нужно подзапросов. Все три агрегата работают с одной и той же группировкой строк (не указано GROUP BY , поэтому одна строка для всей таблицы), поэтому они могут существовать в списке SELECT напрямую.

 SELECT SUM(number) AS number_sum, MAX(number) AS number_max, MIN(number) AS number_min FROM `table` 

Если какой-либо из агрегатов должен быть основан на разных условиях, которые вы должны отфильтровать в предложении WHERE , тогда вам нужно будет либо использовать подзапрос для другого условия, либо сделать декартовое соединение. Этот подзапрос и следующий метод LEFT JOIN должны быть эквивалентными, по производительности для агрегатов, возвращающих только одну строку:

 SELECT /* Unique filtering condition - must be done in a subselect */ (SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum, MAX(number) AS number_max, MIN(number) AS number_min FROM `table` 

Или эквивалент запроса выше, вы можете LEFT JOIN в подзапрос без предложения ON . Это должно быть сделано только в ситуациях, когда вы знаете, что подзапрос вернет только одну строку. В противном случае вы получите декартово произведение – столько строк, сколько возвращено одной стороной соединения, умноженное на количество строк, возвращаемых другой стороной.

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

Это должно быть быстрее ….

 SELECT /* this one has two aggregates sharing a WHERE condition */ subq.number_sum_filtered, subq.number_max_filtered, /* ...and two aggregates on the main table with no WHERE clause filtering */ MAX(`table`.number) AS number_max, MIN(`table`.number) AS number_min FROM `table` LEFT JOIN ( SELECT SUM(number) AS number_sum_filtered, MAX(number) AS number_max_filtered FROM `table` WHERE `somecolumn = `somevalue` ) subq /* No ON clause here since there's no common column to join on... */ 

Чем это…

 SELECT /* Two different subselects each over the same filtered set */ (SELECT SUM(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_sum_filtered, (SELECT MAX(number) FROM `table` WHERE `somecolumn` = `somevalue`) AS number_max_filtered, MAX(`table`.number) AS number_max, MIN(`table`.number) AS number_min FROM `table`