Реляционный запрос Laravel занимает много времени - PullRequest
0 голосов
/ 08 февраля 2019

В моей базе данных есть таблица корректировок службы, транзакции и поставщика. Таблица обслуживания имеет 23 строки, а таблица транзакций - более двухсот тысяч, а таблица корректировки поставщика - 30000 строк.

Мой запрос

$transactions = Service::withCount(['transactions as totalOrder','transactions as amount' =>
 function($query) use ($queryDate){
    $query->whereIn('status',['Success','Pending','Successful','Processing']);
    $query->whereDate('created_at','>=', $queryDate);
    $query->select(DB::raw('SUM(deducted)'));
},'vendorAdjustment as adjustmentPoint' => function($query) use ($queryDate){
    $query->whereDate('created_at','>=', $queryDate);
    $query->select(DB::raw("SUM(amount)"));
}])->get();

Теперь мой запрос выше занимает много времени. Я не могу понять, как его оптимизировать.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Я не вижу ничего плохого в вашем запросе.Проблема может заключаться в том, что вам не хватает определенных индексов в вашей базе данных.Я полагаю, потому что whereDate('created_at', $queryDate) будет переводиться в WHERE DATE(created_at) >= '$queryDate', который должен извлечь фактическую дату из всех записей отметок времени / даты / времени в таблице, прежде чем он сможет выполнить сравнение.Добавление индекса для столбца created_at значительно упростит задачу для базы данных, хотя и незначительно скажется на вставках, обновлениях и удалениях.

Поэтому мое лучшее предположение: добавить индексы для transactions.created_at,transactions.status и vendor_adjustments.created_at.

0 голосов
/ 08 февраля 2019

используйте это:

$transactions = Service::withCount(['transactions as totalOrder','transactions as amount' =>
        function($query) use ($queryDate){
            $query->whereIn('status',['Success','Pending','Successful','Processing']);
            $query->whereDate('created_at','>=', $queryDate);
        },'vendorAdjustment' => function($query) use ($queryDate){
        $query->whereDate('created_at','>=', $queryDate);
    }])->get();
...