Функция соединения в запросе, замедляющая выполнение запроса - PullRequest
0 голосов
/ 20 декабря 2018

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

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

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

1 Ответ

0 голосов
/ 20 декабря 2018

Вам нужно будет проиндексировать все ваши столбцы, к которым применяется условие соединения.В вашем случае: «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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...