Что быстрее работает: count(*) или count(имя_колонки)?
Что проверяют
Понимаете ли вы, что это в первую очередь вопрос семантики, а уже потом скорости. И знаете ли, как конкретная СУБД считает строки: у этого вопроса нет ответа без названия базы.
Как отвечать
Первое и главное: это разные запросы. count(*) считает строки, count(col) считает строки, где col не NULL. Если в колонке есть NULL, результаты просто разойдутся, и сравнивать их по скорости бессмысленно.
Если колонка объявлена NOT NULL, ответы совпадают, и тогда count(*) как минимум не медленнее: движку не нужно доставать значение колонки и проверять его. Дальше уточнить про базу. В PostgreSQL готового счётчика строк нет вообще: из-за MVCC видимость строки зависит от транзакции, поэтому оба варианта означают полный проход, и выигрывает тот, которому доступен index only scan по узкому индексу и свежая карта видимости. В MySQL на InnoDB count(*) оптимизирован отдельно и сам выбирает самый компактный индекс. Если точность не нужна, приблизительное число строк берут из системной статистики, это мгновенно.
Хорошее добавление: count(1) не быстрее count(*), планы одинаковые, это давний миф.
Где спотыкаются
Отвечают «конечно, звёздочка быстрее» и не уточняют ни базу, ни допустимость NULL. Дальше идёт вопрос про NULL, и выясняется, что кандидат сравнивал запросы, дающие разные числа.
Второе: думают, что звёздочка заставляет читать все колонки строки, как в SELECT *. Внутри агрегата это не список колонок, а специальная форма, которая означает «просто строка», никакие значения не извлекаются.
Третье: встретив медленный подсчёт на большой таблице, сразу предлагают счётчик в отдельной таблице или кэш. Сначала стоит проверить, есть ли узкий индекс, подходящий под условие, и не нужен ли вместо подсчёта exists: проверка наличия хотя бы одной строки останавливается на первой найденной, а полный count честно доходит до конца.