Красноречивый запрос НЕ использует индекс - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть запрос Eloquent, который (после переноса в SQL) выглядит следующим образом:

 SELECT COUNT(*) AS AGGREGATE
    FROM `tbl_audits`
    WHERE `created_at` BETWEEN '2018-09-01 00:00:00' AND '2018-10-31 23:59:59' 
    AND `auditable_type` IN ('App\Models\Offer', 'App\Models\AdvertiserContact') 
    AND `fk_user_id` IN ('10250')

Таблица tbl_audits имеет индексы, однако запрос не использует его.Как бы вы предложили переписать запрос для использования индексов?

На всякий случай я также присоединяю свой запрос Eloquent, который генерирует этот запрос SQL.

$logs = Audit::with(array( 'user', 'auditable' ))
        ->whereBetween('created_at', [ "{$start_date} 00:00:00", "{$end_date} 23:59:59" ]);

    if ( $auditLogTypes && $auditLogTypes !== 'null' )
    {
        $auditLogTypesQuery = explode(',', $auditLogTypes);
    }

    if ( in_array(Offer::class, $auditLogTypesQuery) && $offers && $offers !== 'null' )
    {
        $logs->whereIn('auditable_id', explode(',', $offers));
    }

    $logs->whereIn('auditable_type', $auditLogTypesQuery);

    if ( $users && $users !== 'null' )
    {
        $logs->whereIn('fk_user_id', explode(',', $users));
    }

    // count the total data for datatables
    $totalData = $logs->count();

    if ( !$exportToCSV )
    {
        $logs->skip($start)
            ->take($length);
    }

    $logs = $logs->orderBy('created_at', 'DESC')
        ->get();

1 Ответ

0 голосов
/ 21 ноября 2018

Если не существует, вы можете попытаться создать такой составной индекс:

create index idx_aud_created_userid on tbl_audits (created_at, fk_user_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...