Почему порядок размещения колонок не важен при использовании булевых значений в условиях WHERE?

«Почему порядок размещения колонок не важен при использовании булевых значений в условиях WHERE?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Порядок колонок в условиях с булевыми операторами AND и OR не влияет на логический результат, потому что булева алгебра коммутативна для этих операций. A AND B всегда равно B AND A, так же как A OR B равно B OR A.

Однако, с точки зрения производительности запроса, порядок может иметь значение из-за short-circuit evaluation (ленивых вычислений) и особенностей оптимизатора СУБД:

  • Для AND: условие, которое с большей вероятностью будет false, стоит поставить первым, чтобы СУБД раньше прекратила проверку.
  • Для OR: условие, которое с большей вероятностью будет true, стоит поставить первым.

Например, в запросе:

SELECT * FROM users 
WHERE is_active = true 
AND last_login_date > '2024-01-01';

Если большинство пользователей неактивны (is_active = false), то этот фильтр, поставленный первым, позволит быстрее отсечь строки. Современные оптимизаторы баз данных (например, в PostgreSQL, MySQL) могут частично переупорядочивать условия на основе статистики, но явная расстановка приоритетов помогает в сложных случаях.