Оба приведенных примера делают разные вещи, хотя могут выглядеть одинаково. Используйте конструкцию, предназначенную для того, что вы хотите. Беспокойство по поводу «оптимизации» здесь глупо и преждевременно: хорошая модель и хороший дизайн должны стоять на первом месте.
Первый случай - это один запрос - он возвращает один набор результатов (предположительно, до 3 элементов при условии, что ID является PK). Порядок записей в наборе не определен , так как ORDER BY не существует.
Во втором случае есть три запроса - и, таким образом, три набора результатов (определяется порядок наборов результатов по отношению друг к другу) - каждый набор результатов (снова предполагая, что идентификатор является PK) приведет к 0 или 1 записи.
Теперь, если бы все было так просто ... в зависимости от того, была ли выполнена секунда внутри транзакции или нет (и какой уровень изоляции транзакции и что гарантирует выполнение бэкэнда) определяет, будет ли одинаковых товаров гарантированно будут возвращены в обоих случаях. То есть представьте, что запись с ID = 2 удаляется после SELECT ID = 1, но до SELECT ID = 2 - какими должны быть результаты?
С учетом всего вышесказанного, «правильный» выбор, вероятно, является единственным выбором, хотя можно представить патологические случаи, когда желателен второй вариант. В качестве бонуса, как правило, легче иметь дело с одним набором результатов.
Я подозреваю, что первый случай также будет [немного] лучше выполняться только из-за небольших накладных расходов на выполнение запроса , и, в любом случае, не должен быть медленнее , чем второй. Разница в производительности может быть или не быть незначительной в зависимости от других факторов, включая задержку соединения. Однако единственный способ узнать «наверняка» - это запустить тесты производительности на реальных данных / использование и проверить планы запросов (см. EXPLAIN
).
Счастливого кодирования.