@lolrofl01

Что отработает быстрее: связь или join?

Добрый день.
Периодически пользуюсь то связями, то джоинами. И вот хочу уже выбрать что-то одно для дальнейших работ. Но не знаю что эффективнее и быстрее. Цель как обычно - оптимизация БД, дабы проект открывался шустрее, пусть даже на долю секунды.
Итак. Разберем самый частый пример с книгой и автором. Есть таблица с книгами, есть таблица с авторами. Связываются так: в таблице с книгами у каждой книги есть author_id. Можно сделать связь:
public function author() {
      return $this->belongsTo(User::class);
}


А можно использовать left join:
SELECT books.*, authors.name as author_name FROM books 
LEFT JOIN authors 
ON books.author_id = authors.id


В первом случае мы получаем автора так:
$books->author;

Во втором случае:
$books->author_name;

В случае с left join, конечно, придется дописывать лишнее в sql запрос, зато одним запросом сразу вытащим все данные. В случае же со связями, насколько я понимаю, используется такая вещь:
$books = "SELECT * FROM books LIMIT 1";
$author = "SELECT name FROM authors WHERE id = " . $books->author_id;


То есть уже 2 запроса, вместо одного. Правильно я понимаю, или там какой-то другой метод получения автора для книги?

Я просто еще подумал, а что если выводить через цикл все книги, получается такая конструкция будет:
foreach($books as $book) {
echo $book->name . '<br>';
echo $book->author;
}


Это же еще больше запросов из ничего. Не целесообразнее ли использовать left join?

Спасибо!
  • Вопрос задан
  • 277 просмотров
Пригласить эксперта
Ответы на вопрос 5
VladimirAndreev
@VladimirAndreev
php web dev
используйте жадную загрузку, чтобы загрузить сразу модель и все связи, если уверены, что они все нужны. (with)
Ответ написан
Комментировать
Buzzz
@Buzzz
SharePoint | Office 365 | .Net Developer
Если данных не так много думаю лучше использовать left join и полностью подгрузить контекст, если будет много там уже индексы но всегда лучше придерживаться тенантностью между перфомансом бд и перфомансом веба.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Вы же сами уже ответили:
В случае с left join, конечно, придется дописывать лишнее в sql запрос, зато одним запросом сразу вытащим все данные.

join быстрее
Ответ написан
Комментировать
ajaxtelamonid
@ajaxtelamonid
Laravel
Связи понятнее. Неважно что быстрее, скорость переоценена. Скорость работы программиста гораздо важнее в подавляющем большинстве случаев. Автоподсказки в IDE экономят время на опечатках, код выглядит гораздо понятнее через год, без "а вот это поле откуда вообще взялось ?"
Ответ написан
Комментировать
@Kostik_1993
Web Developer
LEFT JOIN обычно юзают там где не используют ORM, но такое бывает необходимо не везде и там где идет экономия ресурсов или при переписывании старых пректов с сохранением структуры БД. Я думаю что вам с вашими проектами (без обид, моими тоже;) ) возможностей ORM более чем достаточно для повседневной работы. Просто пощупайте все возможности ORM и не стоит думать пока о других вещах)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы