SELECT 1
FROM (SELECT 1) t
WHERE EXISTS( SELECT * FROM foo WHERE id = 42 )
Только что протестировано, отлично работает на MySQL v5
COUNT (*) обычно менее эффективен, если:
- вы можете иметь дубликаты (потому что
СУБД придется исчерпывающе
искать все записи / индексы
дать вам точный ответ) или
- имеют пустые записи (для того же
причина)
Если вы СЧИТАЕТЕ на основе предложения WHERE, которое гарантированно создаст одну запись (или 0) и , то СУБД знает об этом (основываясь на индексах UNIQUE), тогда это должно быть просто так же эффективно. Но вряд ли у вас всегда будет такое состояние. Кроме того, СУБД может не всегда реагировать на это в зависимости от версии и СУБД.
Подсчет в приложении (когда вам не нужна строка) почти всегда гарантированно будет медленнее / хуже, потому что:
- Вы должны отправить данные клиенту, клиент должен их буферизовать и выполнить некоторую работу
- В кэше данных СУБД MRU / LRU вы можете столкнуться с более важными вещами
- Ваша СУБД (как правило) должна будет выполнять больше операций дискового ввода-вывода для извлечения данных записи, которые вы никогда не будете использовать
- У вас больше активности в сети
Конечно, если вы хотите что-то сделать со строкой, если она существует, то определенно быстрее / лучше просто попытаться получить строку для начала!