MySQL несколько строк выберите производительность - PullRequest
0 голосов
/ 17 июля 2011

есть ли разница в производительности между:

SELECT * FROM table WHERE id IN (1,2,3)

против

SELECT * FROM table WHERE id = 1
SELECT * FROM table WHERE id = 2
SELECT * FROM table WHERE id = 3

, при котором вы выполняете каждый запрос, поэтому всего PHP выполняет 3 запроса

Ответы [ 5 ]

4 голосов
/ 17 июля 2011

Оба приведенных примера делают разные вещи, хотя могут выглядеть одинаково. Используйте конструкцию, предназначенную для того, что вы хотите. Беспокойство по поводу «оптимизации» здесь глупо и преждевременно: хорошая модель и хороший дизайн должны стоять на первом месте.

Первый случай - это один запрос - он возвращает один набор результатов (предположительно, до 3 элементов при условии, что ID является PK). Порядок записей в наборе не определен , так как ORDER BY не существует.

Во втором случае есть три запроса - и, таким образом, три набора результатов (определяется порядок наборов результатов по отношению друг к другу) - каждый набор результатов (снова предполагая, что идентификатор является PK) приведет к 0 или 1 записи.

Теперь, если бы все было так просто ... в зависимости от того, была ли выполнена секунда внутри транзакции или нет (и какой уровень изоляции транзакции и что гарантирует выполнение бэкэнда) определяет, будет ли одинаковых товаров гарантированно будут возвращены в обоих случаях. То есть представьте, что запись с ID = 2 удаляется после SELECT ID = 1, но до SELECT ID = 2 - какими должны быть результаты?

С учетом всего вышесказанного, «правильный» выбор, вероятно, является единственным выбором, хотя можно представить патологические случаи, когда желателен второй вариант. В качестве бонуса, как правило, легче иметь дело с одним набором результатов.

Я подозреваю, что первый случай также будет [немного] лучше выполняться только из-за небольших накладных расходов на выполнение запроса , и, в любом случае, не должен быть медленнее , чем второй. Разница в производительности может быть или не быть незначительной в зависимости от других факторов, включая задержку соединения. Однако единственный способ узнать «наверняка» - это запустить тесты производительности на реальных данных / использование и проверить планы запросов (см. EXPLAIN).

Счастливого кодирования.

1 голос
/ 17 июля 2011

Хотя в этом конкретном примере разница может быть незначительной, да, разница есть.

Первая версия - 1 запрос, вторая версия - 3 запросаВыполнение большего количества запросов обычно приводит к дополнительным накладным расходам.

0 голосов
/ 17 июля 2011

Получите ли вы эти id s в других частях вашего приложения?
Если вы получите id = 1 в другом месте, лучше сделать отдельные запросы.
В противном случае, если вам всегда нужно извлечь эти 3 записи вместе - извлеките их одним запросом.

Например, давайте представим, что вам нужно получить некоторые данные о node. Чем вы можете создать функцию:

getNode($id)
{
  //you can cache each query to make it faster
  if ($node = get_from_cache($id)) return $node;

  //fetch from DB
  $node = ... SELECT * FROM table WHERE id = $id

  //and cache this value
  set_cache($id, $node);

  return $node;
}
0 голосов
/ 17 июля 2011

Существует: каждый запрос включает в себя круговую передачу по сети, при трехкратном прохождении по сети наверняка будет больше служебной нагрузки, чем один.

0 голосов
/ 17 июля 2011

Да, выполнение 3-х отдельных запросов будет намного медленнее в этом случае, особенно если индексы не задействованы и вы работаете с большими таблицами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...