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.