Функция соединения в запросе, замедляющая выполнение запроса

У меня есть две таблицы, обе содержат данные около 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();

Этот запрос дает правильный результат, но время, затрачиваемое на его обработку, очень велико, иногда даже время ожидания.

Кто-нибудь может мне помочь, как я могу оптимизировать этот запрос?

2

Решение

Вам нужно будет проиндексировать все ваши столбцы, к которым применяется условие соединения. В вашем случае: «compid», «c_cod» в обеих ваших таблицах.

В общем-то, «Ограничение первичного ключа» столбцы автоматически индексируются в базах данных, хотя вам придется индексировать «Ограничение внешнего ключа» столбцы вручную.

Некоторые советы по индексированию:

  1. Сначала создайте индекс для поля, которое имеет наибольшее разнообразие значений. Это приведет, так сказать, к «наибольшей отдаче».
  2. Держите индексы маленькими. Лучше иметь индекс только по почтовому индексу или почтовому индексу, чем по почтовому индексу & страна. Чем меньше индекс, тем лучше время отклика.
  3. Для высокочастотных функций (тысячи раз в день) целесообразно иметь очень большой индекс, поэтому системе даже не нужна таблица для функции чтения.
  4. Для небольших таблиц индекс может быть невыгодным. То же самое можно сказать и о любой функции, в которой система будет лучше сканировать всю таблицу.

Помните, что индекс замедляет добавления, изменения и удаления, потому что индексы должны обновляться всякий раз, когда таблица. Поэтому лучше всего добавлять индекс для значений, которые часто используются для поиска, но не сильно меняются. Таким образом, индекс по номеру банковского счета лучше, чем индекс по балансу.

Советы https://www.databasejournal.com/features/mysql/article.php/3840606/Maximizing-Query-Performance-through-Column-Indexing-in-MySQL.htm

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector