Проверка наличия записей в БД: за один шаг или за два шага? - PullRequest
2 голосов
/ 14 апреля 2010

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

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

Пример:

3 таблицы a, b и ab (соединительная таблица)

select * from 
from a, b, ab 
where condition
and condition 
and condition 
and condition etc...

или

select id 
from a, b ab 
where condition

тогда, если существует, сделайте запрос выше.

Так что я не знаю, есть ли причина для второго. Есть идеи, как это влияет на производительность БД или это вообще имеет значение?

Ответы [ 3 ]

3 голосов
/ 14 апреля 2010

Обычно самая медленная часть запроса - это фильтр, затем индексированный поиск, объединения и т. Д. Если требуется перенести много данных - передача также занимает много времени. Это будет вдвое медленнее, если вы проверите существование и извлечете данные. Просто извлеките данные. Если он есть, вы получаете его, а если нет - вы ничего не получаете.

При извлечении из нескольких таблиц JOIN быстрее и гибче.

1 голос
/ 14 апреля 2010

Я обычно предпочитаю подход "два запроса", когда результаты должны быть разбиты на страницы или кэшированы. Например:

$found_ids = "select id from products where ...complex $condition...."

maybe add to cache ($condition => $found_ids)

$ids_to_show = array_slice($found_ids, $_GET['page'], $pagesize);

$data = "select * from products, more tables ... where products.id IN($ids_to_show)";

Поскольку первый запрос может возвращать потенциально длинный список идентификаторов, получение данных для всех из них будет пустой тратой времени.

0 голосов
/ 14 апреля 2010

Еще одно примечание, которое следует учитывать, если вы беспокоитесь о времени выполнения. Избегайте использования '*' в операторе выбора. Это может быть простая заметка, но она напрямую влияет на время выполнения запроса. Обновите оператор выбора, используйте псевдонимы, индексируйте ключи u'r и выберите только необходимые поля.

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