Я действительно новичок в разработке веб-приложений и поэтому работаю с 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;
}
}
Теперь мои вопросы:
Использование 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;
}
});
В зависимости от вашей настройки, эхо может сильно замедлить процесс.
Других решений пока нет …