Являются ли Laravel Eloquents вместе с использованием чанков медленнее по сравнению с обычными построителями запросов laravel с чанками при работе с миллионами записей?

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

Позвольте мне сначала начать с описания моей структуры таблицы: Структура таблицы

Я использую InnoDB MySql … И эта таблица в настоящее время хранит около 13 тыс. Записей и предназначена для хранения миллионов или даже миллиардов записей в будущем …

Теперь описываю мою проблему как:

Когда я выбираю все записи из этой таблицы, то есть 13 тыс. Записей, с помощью обычного построителя запросов laravel, использующего чанк (следующий код описывает способ получения записей), я получаю результаты в течение 1,39 секунд, что хорошо, но на самом деле это должно быть еще более эффективно (эти результаты могут быть из-за ограниченного объема оперативной памяти в моей системе, я не тестировал системы высокого класса), но, если я и здесь делаю ошибки, пожалуйста, дайте мне знать.

DB::table($tableName->dataTableName)->orderBy('id')->chunk(100, function($data) {
foreach ($data as $record) {
echo "DateTime: " .$record->DateTime. " id: ".$record->meter_id;
}
})

и когда я делаю то же самое с eloquent с использованием чанков (следующий код описывает способ получения записей с использованием eloquent), я не получаю полных результатов даже через 60 секунд, что совершенно неприемлемо …

Data::orderBy('id')->chunk(100, function($data) {
foreach ($data as $record) {
echo "DateTime: " .$record->DateTime. " id: ".$record->meter_id
}
})

Я использую другие модели в data модель, чтобы получить имя таблицы … Ниже приводится содержание data модель …

<?php namespace App;

use Illuminate\Database\Eloquent\Model;
use App\dataTableMaster as DataTableMaster;
use App\Company;

class Data extends Model {

/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'data';

//========This following constructor assigns table name depending upon client which has logged in... ===============
public function __construct(){
$user = \Auth::user();
$associatedIdOfUser = $user->asso_id;
$associatedCompanyObjectOfUser = Company::where('id',$associatedIdOfUser)->first();
$companyRoot = $associatedCompanyObjectOfUser->getRoot();
$tableObject = DataTableMaster::where('company_id',$companyRoot->id)->orderBy('created_at','desc')->first();
$this->table = $tableObject->dataTableName;
}

}

Теперь мои вопросы:

  1. Действительно ли eloquents медленнее, чем обычный построитель запросов, потому что, eloquents создает объекты результатов, а позже — нет. ??
  2. Если красноречивости не намного медленнее, сравните их со строителем запросов, то есть красноречья также эффективны для извлечения тысяч или миллионов записей, таких как построитель запросов THAN
    1. Какие ошибки я здесь делаю, из-за чего у меня проблемы? Это в структуре таблицы или способ, я выбираю записи или что это? Пожалуйста, объясните о них.
    2. Целесообразно ли работать с таким большим столом, используя эликвенты?
  3. Если красноречивости действительно медленнее и не рекомендуется использовать при работе с миллионами записей, чем какими способами мы можем работать с миллионами таблиц, возможно ли работать с ними только через конструкторы запросов? А также, почему они медленнее, потому что это создает объекты или причина — это что-то еще?

4

Решение

Использование Eloquent примерно в 3 раза медленнее, чем использование Query Builder напрямую. (контрольные). ORM должен отображать данные на объекты, поэтому он всегда будет медленнее, и никак не обойти это.

Если вы планируете иметь дело с миллионами записей, забудьте об ORM. Он больше не существует для вас. Вам придется делать пользовательские запросы.

Порции на 100 недостаточно. Я считаю безопасным подняться до 5000. Вы можете увеличить или уменьшить это число, контролируя использование вашей памяти.

Имейте в виду, что sql быстрее php, поэтому делайте как можно больше в sql. И не забудьте выбрать только те поля, которые вам нужны — это снизит использование памяти.

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

DB::table('data')->select('DateTime', 'meter_id')->chunk(5000, function($data) {
foreach ($data as $record) {
echo "DateTime: " .$record->DateTime. " id: ".$record->meter_id;
}
});

В зависимости от вашей настройки, эхо может сильно замедлить процесс.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]