我需要一些帮助。 在我的数据库中我有2个表
我的数据库有2个表的合约(约2 500 000条记录)和客户(约1 500 000条记录)。 2个表/ 2个模型之间的关系。
class Contract extends Model
{
public function customer()
{
return $this->belongsTo('App\Customer');
}
}
class Customer extends Model
{
public function contracts()
{
return $this->hasMany('App\Contract');
}
}
通过一些帮助社区Stack I构建了这个功能
$customers = Customer::with(['contracts' => function($query)
{
$query->where('pos', 'Ropczyce')
->where('typ', 'U')
->where('data_end','>=','2017-07-01')
->where('data_end','<=','2017-08-31');
}
])->whereHas('contracts', function ($query) {
$query->where('pos', 'Ropczyce')
->where('typ', 'U')
->where('data_end','>=','2017-07-01')
->where('data_end','<=','2017-08-31');
})
->paginate(20);
但生成的数据花了很多时间(大约6-7秒)。我想在这一刻,函数可以处理所有客户并搜索查询为真的合同。在我看来,这是一个问题。
我搜索一些解决方案以节省时间。只搜索花费大约1秒钟的合同。
$contracts = Contract::where('pos', 'Ropczyce')
->where('typ', 'U')
->where('data_end','>=','2017-07-01')
->where('data_end','<=','2017-08-31')
->with('customer')->paginate(20);
我关心数据建立在这个原则之上。 Client1 - contact1,contract2 ...... Client2 - contact1,contract2 ......
e.t.c
表合约代码
public function up()
{
Schema::create('contracts', function (Blueprint $table) {
$table->increments('id');
$table->integer('customer_id')->unsigned();
$table->char('phone_number',9);
$table->date('data_start');
$table->date('data_end');
$table->char('contract_number',90);
$table->char('pos',10);
$table->char('typ',1);
$table->char('weryfikacja',1);
$table->date('data_weryfikacji');
});
}
答案 0 :(得分:2)
您应该为数据库添加a composite index以获取这些过滤器,这将使查询更快。
Schema::create('contracts', function (Blueprint $table) {
$table->increments('id');
$table->integer('customer_id')->unsigned();
$table->char('phone_number',9);
$table->date('data_start');
$table->date('data_end');
$table->char('contract_number',90);
$table->char('pos',10);
$table->char('typ',1);
$table->char('weryfikacja',1);
$table->date('data_weryfikacji');
// Composite index for faster filtering on these fields.
$table->index(['pos', 'typ', 'date_end']);
});