Count(*) vs Count(колонка) в SQL: разница и правильное использование
Быстрый ответ
Для подсчета всех строк в таблице, включая те, где есть значения NULL, используйте COUNT(*). Если же вы хотите узнать количество всех ненулевых значений в определённой колонке, используйте COUNT(имя_колонки).
Подробнее разберем на примерах SQL-кода:
SELECT COUNT(*) FROM ваша_таблица; -- Общее количество строк в таблице
SELECT COUNT(ваша_колонка) FROM ваша_таблица; -- Количество ненулевых значений в колонке 'ваша_колонка'
В общем и целом, используйте COUNT(*) для вычисления общего количества строк и COUNT(имя_колонки), чтобы подсчитать количество записей с ненулевыми полями в данной колонке.
С точки зрения производительности, COUNT(*) чаще всего бывает быстрее, особенно когда в запросе отсутствует условие WHERE и применяется хранилище MyISAM, позволяющее операции проходить без обращения к данным. Преимущество COUNT(имя_колонки) проявляется при работе с индексированными колонками, но скорость его выполнения зависит от выбранной СУБД и стратегии использования индексации.

Учет особенностей вашей базы данных (Влияние на производительность)
Выбор колонки с индексом
Индексация может серьезно повлиять на скорость выполнения операций подсчета:
- Колонки без индекса:
COUNT(имя_колонки)проходит через каждую строку для проверки на NULL, что замедляет выполнение запроса. - Индексированные колонки: При наличии индекса
COUNT(имя_колонки)может выполняться быстрее, иногда даже наравне сCOUNT(*).
MyISAM против InnoDB
- MyISAM: В этом случае
COUNT(*)выполняется очень быстро благодаря прямому доступу к хранящемуся числу строк. - InnoDB: Используя этот движок,
COUNT(*)может работать так же быстро, какCOUNT(имя_колонки).
Учет уникальных значений
Чтобы подсчитать уникальные значения, применяйте COUNT(DISTINCT имя_колонки). Соответствующую скорость этой операции также можно улучшить за счёт индексации.
Визуализация
Рассмотрим различия между COUNT(*) и COUNT(имя_колонки) на примере подготовки к вечеринке:
COUNT(*)подсчитывает все подготовительные мероприятия, в том числе и те, которые не всегда приятны.COUNT(имя_колонки)подсчитывает только те задачи, которые вы хотите выполнить, например, связанные с приготовлением пищи.
Таким образом, COUNT(*) учитывает все без исключения, а COUNT(имя_колонки) исключает пустые значения и подсчитывает только заполненные поля.
Моменты, о которых стоит знать заранее (Особые соображения)
Точность против скорости
Наиболее быстрым обычно является COUNT(*), но также важна и точность: если ключевая колонка не содержит NULL, любой метод даст верный результат. COUNT(имя_колонки) станет хорошим выбором, если для вас важно учитывать пустые значения.
Контекст имеет значение
Выбирайте между COUNT(*) и COUNT(имя_колонки) основываясь на цели запроса и структуре таблицы.
Обдуманный запрос
Важно не только выбрать между двумя типами COUNT, но и грамотно составить всю структуру запроса для достижения лучшей производительности.
Полезные материалы
- Обсуждение влияния на производительность
COUNT(*)иCOUNT(1)на платформе Stack Overflow. - Аналитический обзор работы MySQL InnoDB с
COUNT(*). - Анализ различий в производительности команд COUNT и методик работы с SQL на SQL Authority.