2013-11-21 5 views
4

, когда я использую красноречив, чтобы получить данные, и выяснили некоторые проблемы с производительностьюLaravel Eloquent проблема производительности

В моем случае, я использую Laravel DebugBar (https://github.com/barryvdh/laravel-debugbar) для сбора информации, что мне нужно.

, когда я использую ОРМ получить около 20 записей из моей БД

$projects = Project::where('status', '=', 2)->get(); 

потребовалось об использовании 24MB памяти и 250мс

, но когда я использую конструктор запросов, как показано ниже

$projects = DB::table('Project')->where('status','=',2)->get(); 

запросы базы данных и возвращаемые данные почти одинаковы, но построитель запросов использовал только 11 МБ памяти и 113 мс для получения данных.

когда данные мне нужно около 200 записей, и даже относятся к другим таблицам через ОРМ, это займет почти 8000ms ... и получить «Разрешенные размер памяти исчерпаны» сообщение об ошибке очень часто ..

Так , Мне было интересно, в моем случае следует использовать построитель запросов и присоединиться к другой таблице?

Или что мне делать, чтобы ускорить работу «Красноречивый»?

ответ

3

Наконец-то я выяснил, где проблема. На самом деле, эта проблема на самом деле не вызвана Eloquent ORM, а видом. Это то, что я сделал для фиксированной задачи

  • Нетерпеливый загрузки: Поскольку существует 4 отношения, на мой взгляд, так это вызвать N + 4 запросов, я использую жадную загрузку с фиксированным его. и использовать

  • Кэш: Я использую функцию запоминания() для кэширования результатов.

  • Отмена проверки изображения: Последнее, что я сделал, но самое главное - отменить проверку изображений на S3.

Загрузка страницы получает огромную скорость. :)

2

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

DB::connection()->disableQueryLog() 

и использовать кэширование: http://four.laravel.com/docs/cache,

если нет существенной разницы, то да, вы pobably просто нужно использовать конструктор запросов или даже базовый:

DB::select(//your query here...)