Мне самому было любопытно. Хорошо читать документацию и теоретические ответы, но мне нравится сопоставлять их с эмпирическими данными.
У меня есть таблица MySQL (InnoDB), в которой содержится 5 607 997 записей. Таблица находится в моей собственной изолированной программной среде, поэтому я знаю, что содержимое статично, и никто другой не использует сервер. Я думаю, что это эффективно удаляет все внешние воздействия на производительность. У меня есть таблица с полем первичного ключа auto_increment (Id), которое, как я знаю, никогда не будет равно нулю, и я буду использовать его для проверки условия where (WHERE Id NOT NULL).
Единственный другой возможный сбой, который я вижу при запуске тестов, - это кеш. Первый запуск запроса всегда будет медленнее, чем последующие запросы, использующие те же индексы. Я буду называть это ниже вызовом Seeding в кэше. Просто чтобы немного его перепутать, я запустил его с предложением where, которое, как я знаю, всегда будет иметь значение true, независимо от каких-либо данных (TRUE = TRUE).
Здесь сказано, что мои результаты:
QueryType
| w/o WHERE | where id is not null | where true=true
COUNT ()
| 9 min 30.13 sec ++ | 6 min 16.68 sec ++ | 2 min 21.80 sec ++
| 6 min 13.34 sec | 1 min 36.02 sec | 2 min 0.11 sec
| 6 min 10.06 se | 1 min 33.47 sec | 1 min 50.54 sec
COUNT (Id)
| 5 min 59.87 sec | 1 min 34.47 sec | 2 min 3.96 sec
| 5 min 44.95 sec | 1 min 13.09 sec | 2 min 6.48 sec
COUNT (1)
| 6 min 49.64 sec | 2 min 0.80 sec | 2 min 11.64 sec
| 6 min 31.64 sec | 1 min 41.19 sec | 1 min 43.51 sec
++ Это считается вызовом заполнения кэша. Ожидается, что он будет медленнее, чем остальные.
Я бы сказал, что результаты говорят сами за себя. COUNT (Id) обычно вытесняет других. Добавление предложения Where значительно сокращает время доступа, даже если это предложение, которое, как вы знаете, оценивает как истинное. Похоже, что сладкой точкой является COUNT (Id) ... ГДЕ Id НЕ НЕДЕЙСТВИТЕЛЕН.
Мне бы очень хотелось увидеть результаты других людей, возможно, с меньшими таблицами или с предложениями where для полей, отличных от того, на которое вы рассчитываете. Я уверен, что есть другие варианты, которые я не учел.