У меня есть две таблицы, обе содержат данные около 200 000. Я написал запрос, как показано ниже, чтобы получить данные, используя некоторые соединения.
Это запрос, который я пытался
$dbYTD = DB::table('stdtsum as a')
->join(DB::raw("(select distinct s_id, c_cod, compid from stdcus) b"), function($join){
$join->on('a.compid', '=', 'b.compid')->on('a.c_cod', '=', 'b.c_cod');
})
->select('b.s_id', DB::raw('sum(turnover) as sumturn'))
->whereBetween('date', [$startYTD, $endYTD])
->groupBy('b.s_id')
->get()
->toArray();
Этот запрос дает правильный результат, но время, затрачиваемое на его обработку, очень велико, иногда даже время ожидания.
Кто-нибудь может мне помочь, как я могу оптимизировать этот запрос?
Вам нужно будет проиндексировать все ваши столбцы, к которым применяется условие соединения. В вашем случае: «compid», «c_cod» в обеих ваших таблицах.
В общем-то, «Ограничение первичного ключа» столбцы автоматически индексируются в базах данных, хотя вам придется индексировать «Ограничение внешнего ключа» столбцы вручную.
Некоторые советы по индексированию:
Помните, что индекс замедляет добавления, изменения и удаления, потому что индексы должны обновляться всякий раз, когда таблица. Поэтому лучше всего добавлять индекс для значений, которые часто используются для поиска, но не сильно меняются. Таким образом, индекс по номеру банковского счета лучше, чем индекс по балансу.
Других решений пока нет …