Ускорить красноречивый запрос - PullRequest
2 голосов
/ 25 мая 2019

Я пытаюсь запросить большой объем данных (40K записей) и планирую запрашивать гораздо большие наборы данных в будущем.Eloquent, кажется, очень долго загружает эти данные.Я задавался вопросом, есть ли более быстрый способ обработки этих данных.Я пытаюсь проверить достоверность моих данных, и, следовательно, проверяю, все ли поля являются нулевыми.

Я использовал обычные Eloquent звонки.Я не думаю, что разбивать данные на части уместно, так как я не планирую каким-либо образом изменять данные.Я размышлял о том, может ли выполнение работы так часто и назовите результаты этой работы лучшим подходом.

$journal = Journal::where('issn', $this->issn)->first();
$collection = $journal->outputs;
$collectionUnique = $collection->unique('doi');
$collectionDupes = $collection->diff($collectionUnique);

dd('Total Articles '.$this->getTotal(), 'Total Articles '.count($collection));

1 Ответ

3 голосов
/ 26 мая 2019

Просто используйте Query Builders !

Почему мы должны использовать Query Builders для большого количества записей вместо Eloquent?!

Вот причина:

Query Builder так быстрее , чем Eloquent:

Сравнение (Eloquent и Query Builder):

Для вставки 1000 строк в простую таблицу Eloquent требуется 1,2 секунды, и в этом случае для фасадов БД требуется всего 800 миль (мс).

Еще одно сравнение:

Среднее время отклика Eloquent ORM

Joins | Average (ms) 
------+-------------
1     | 162,2 
3     | 1002,7 
4     | 1540,0 

Result of select operation average response time for Eloquent ORM

Среднее время ответа SQL

 Joins | Average (ms) 
------+-------------
1     | 116,4 
3     | 130,6 
4     | 155,2 

Result of select operation average response time for Raw SQL

Для получения дополнительной информации: Laravel Eloquent vs Query Builder


Отредактировано:

Ваш код должен быть:

$journal = DB::table('journals')->where('issn', $this->issn)->first();


И тогда для использования коллекции (простой способ):

$journal = Collection::make($journal); //For use Collection Methods
$collection = $journal->get("outputs");//Changed
$collectionUnique = $collection->unique('doi');
$collectionDupes = $collection->diff($collectionUnique);

dd('Total Articles '.$this->getTotal(), 'Total Articles '.count($collection));

Лучшая производительность:

Используйте запросы и Query Builder вместо коллекций. Потому что операции в SQL часто выполняются быстрее.

Пожалуйста, сравните время для вашего последнего кода и этого кода, и, пожалуйста, дайте мне знать в комментариях :)

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