Дорого ли повторение COUNT (*) в запросе MySQL? - PullRequest
0 голосов
/ 09 января 2020
SELECT 
    author_fname, 
    author_lname, 
    CASE
        WHEN COUNT(*) = 1 THEN '1 book'
        ELSE CONCAT(COUNT(*), ' books')
    END AS 'No. of books'
FROM books
GROUP BY author_fname, author_lname;

Я дважды вызываю COUNT (*) в этом запросе, хотя результат тот же. MySQL автоматически знает, что ему не нужно пересчитывать это значение?

Если нет, как я могу сделать этот запрос более эффективным, не повторяя COUNT (*)?

Ответы [ 2 ]

1 голос
/ 09 января 2020

Я полагаю, MySQL оптимизировал COUNT (*) там, где это совсем не дорого (просто промежуточный итог строк, а не текущий счет); но для более сложной агрегации, такой как COUNT(DISTINCT someField), подзапросы часто являются лучшим вариантом.

SELECT author_fname, author_lname 
   , CASE WHEN myCalc = 1 THEN '1 book'
          ELSE CONCAT(myCalc, ' books')
    END AS 'No. of books'
FROM (
   SELECT author_fname, author_lname, COUNT(*) AS myCalc
   FROM books
   GROUP BY author_fname, author_lname
) AS q
;

Тем не менее, я не уверен, достаточно ли умен MySQL для выполнения MAX(a+b+c*d) только один раз если это происходит много раз в одном запросе. Я надеюсь, что это произойдет, и не удивлюсь, что это уже делает; но я никогда не сталкивался с документацией, подтверждающей это.

0 голосов
/ 09 января 2020

Как правило, вычисление выражений (независимо от того, повторяются они или нет) занимает намного меньше времени, чем выборка строк, участвующих в запросе. Так что не беспокойся об этом.

...