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

Ответ

Порядок колонок в условиях с булевыми операторами 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) могут частично переупорядочивать условия на основе статистики, но явная расстановка приоритетов помогает в сложных случаях.

Ответ 18+ 🔞

Ну, вот смотри, тут есть один момент, который многих вводит в ступор. Говорят, что порядок колонок в AND и OR — это пиздец важная штука для скорости. А на самом деле, ёпта, с точки зрения чистой логики — да похуй.

Потому что булева алгебра — она как закон: A AND B — это то же самое, что и B AND A. Ну реально, какая разница, «хлеб И масло» или «масло И хлеб»? Бутерброд-то один и тот же получится, правда? С OR та же история. Так что с этой стороны — волнение ебать, расслабься.

НО! Вот тут начинается самое интересное, хитрая жопа. С точки зрения того, как база данных это жуёт и переваривает, порядок может быть овердохуища важен. Всё из-за этой штуки — short-circuit evaluation, или ленивые вычисления, если по-нашему.

Представь, ты стоишь на КПП и проверяешь пропуска. Условие AND — это как два охранника, оба должны тебя пропустить.

  • Если первый охранник (первое условие) сразу говорит: «Иди нахуй, не проходишь», — то ко второму тебя даже не пустят, зачем время терять? Поэтому в AND первым ставь самое жёсткое, самое отсекающее условие, которое чаще всего будет false. Пусть база отбрасывает строки сразу, а не тратит силы на проверку второго условия для заведомого брака.
SELECT * FROM users 
WHERE is_active = true 
AND last_login_date > '2024-01-01';

Допустим, у тебя 95% пользователей — неактивные боты. Если поставить is_active = true первым, то для этих 95% запрос упрётся в него, скажет «ну его нахуй» и даже не полезет смотреть дату последнего логина. Быстро и эффективно.

С OR — всё наоборот. Это как два охранника, и достаточно, чтобы хоть один кивнул.

  • Если первый сразу говорит: «Проходи, друг», — то проверять второго уже не нужно. Поэтому в OR первым ставь самое мягкое, самое проходное условие, которое чаще всего будет true.

Современные оптимизаторы в PostgreSQL или MySQL — они не лыком шиты, у них статистика есть. Они иногда сами могут переставить условия местами, если посчитают, что так будет быстрее. Но чувак, доверия ебать ноль. Особенно в хитрых запросах, где всё перемешано. Лучше самому подумать головой и помочь базе, расставив приоритеты явно. Экономия времени может быть просто ни хуя себе.