加快查询laravel [解决]

时间:2017-08-21 08:09:43

标签: php mysql laravel

我需要一些帮助。 在我的数据库中我有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');
        });
    }

1 个答案:

答案 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']); 
});