Count(*) vs Count(колонка) в SQL: разница и правильное использование

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для подсчета всех строк в таблице, включая те, где есть значения NULL, используйте COUNT(*). Если же вы хотите узнать количество всех ненулевых значений в определённой колонке, используйте COUNT(имя_колонки).

Подробнее разберем на примерах SQL-кода:

SQL
Скопировать код
SELECT COUNT(*) FROM ваша_таблица;         -- Общее количество строк в таблице
SELECT COUNT(ваша_колонка) FROM ваша_таблица;  -- Количество ненулевых значений в колонке 'ваша_колонка'

В общем и целом, используйте COUNT(*) для вычисления общего количества строк и COUNT(имя_колонки), чтобы подсчитать количество записей с ненулевыми полями в данной колонке.

С точки зрения производительности, COUNT(*) чаще всего бывает быстрее, особенно когда в запросе отсутствует условие WHERE и применяется хранилище MyISAM, позволяющее операции проходить без обращения к данным. Преимущество COUNT(имя_колонки) проявляется при работе с индексированными колонками, но скорость его выполнения зависит от выбранной СУБД и стратегии использования индексации.

Кинга Идем в IT: пошаговый план для смены профессии

Учет особенностей вашей базы данных (Влияние на производительность)

Выбор колонки с индексом

Индексация может серьезно повлиять на скорость выполнения операций подсчета:

  • Колонки без индекса: 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, но и грамотно составить всю структуру запроса для достижения лучшей производительности.

Полезные материалы

  1. Обсуждение влияния на производительность COUNT(*) и COUNT(1) на платформе Stack Overflow.
  2. Аналитический обзор работы MySQL InnoDB с COUNT(*).
  3. Анализ различий в производительности команд COUNT и методик работы с SQL на SQL Authority.