Laravel Eloquent Eager Загрузка с принадлежностью слишком медленной - PullRequest
0 голосов
/ 05 июня 2019

У меня есть users, который может принадлежать groups во многих отношениях.Я пытаюсь получить ( paginate ) пользователей со всеми группами, к которым они принадлежат.Это прекрасно работает, но когда у меня более 1000 пользователей, все становится очень медленно, хотя я делаю только 25-50 страниц за раз.На моей модели User:

public function groups()
{
    return $this->belongsToMany('App\Models\UserGroup', 'group_user', 'user_id', 'group_id');
}

Мой запрос:

User::with('groups')->paginate(50);

Так что, если в базе данных (MySQL) всего около 50 пользователей, все очень быстро (<= 300 мс).Но когда я добавляю 1000, хотя я все еще делаю постраничную передачу до 50 на страницу, она сканирует (~ 3 секунды). </p>

РЕДАКТИРОВАТЬ

На самом деле обычный запрос с примерно 50 ВСЕМИ пользователями~ 100 мс, а не 300 мс.

1 Ответ

1 голос
/ 06 июня 2019

Благодаря комментарию Тиаго Баркалы мне удалось проанализировать журналы запросов с помощью:

\DB::enableQueryLog();
// perform query...
var_dump(\DB::getQueryLog());

И я нашел проблему.По сути, у меня был атрибут with в моей модели групп:

protected $with = [
    'features',
    'users'
];

Итак, мне возвращают группу пользователей, и они возвращают свои группы, и каждая из этих групп возвращает всепользователей в них.Таким образом, я получал около 10 МБ данных, возвращаемых всеми из-за этого отношения, в том числе большего количества отношений.Я снял with и все хорошо.

...