Простой Eloquent запрос занимает слишком много времени для выполнения - PullRequest
0 голосов
/ 16 ноября 2018

У меня 2 запроса. Несмотря на то, что первый более сложный и извлекает гораздо больше данных, его выполнение занимает всего 154 мс, а второй - 1,76 с.

Первый (выполняется быстро):

$offers = Offer::select(\DB::raw('tbl_offer.offer_id as sys_id, 
                                  tbl_offer.offer_name, 
                                  tbl_offer.preview_url, 
                                  COALESCE(tbl_offer.is_allow_website_links, 
                                  false) as is_allow_website_links, 
                                  tbl_offer.is_require_approval, 
                                 tbl_relationship.fk_relationship_status_id, 
                                  tbl_offer.is_private,
                                  tbl_offer.currency'))
                        ->leftJoin('tbl_relationship', function ($q) use ($affiliateId) {

                        $q->on('tbl_offer.offer_id', '=', 'tbl_relationship.fk_offer_id')
                          ->where('tbl_relationship.fk_affiliate_id', '=', $affiliateId);})
                          ->whereIn('fk_offer_status_id', [ 18, 19 ])
                          ->where('is_display', 1)
                          ->where('tbl_offer.is_trd_deleted', 0)
                          ->orderBy('offer_name')
                          ->get();

Секунда (выполняется медленно):

$currencies = Currency::select(\DB::raw('DISTINCT currency_code_from AS currency'))
                 ->where('sys_name', 'openexchangerates')
                 ->orderBy('currency')
                 ->get();   
  1. В чем может быть проблема?
  2. У вас есть идеи, как уменьшить время загрузки?

Ответы [ 3 ]

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

Как сказал @Nikolas, изменение скорости с select(DB::raw.. на selectRaw(... поможет со скоростью.

Другая вещь, которую вы захотите проверить, - это индексация по основным столбцам таблицы.

Я предполагаю, что вы используете Mysql, поэтому посмотрите на приведенные ниже документы по индексации

https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html

Наличие индексов для ключевых столбцов таблиц может существенно повлиять на скорость запросов

Документы содержат подробности о добавлении индексов посредством миграций здесь:

https://laravel.com/docs/5.5/migrations#indexes

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

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

Мне удалось сократить время загрузки запросов с 1,76.с до 0,127 с.

Я решил проблему с помощью некоторого «обхода».Поскольку курс валюты меняется каждый день для каждой доступной валюты, я просто получаю самый большой currency_rate_batch_id и получаю все валюты, связанные с этим идентификатором (позволяет мне быстро получить все отдельные валюты).

Однако я буду применять индексацию (как предложил @Josh) и избегать двойных запросов по всему проекту (как предложено @Nicolas).

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

Прежде всего вы используете 2 запроса в одном.

Это первый запрос:

$currencies = Currency::where('sys_name', 'openexchangerates')
            ->orderBy('currency')
            ->get();  

И это еще один:

\DB::raw('DISTINCT currency_code_from AS currency')

ВЧтобы использовать оба запроса в одном, вы должны использовать это:

$currencies = Currency::selectRaw('DISTINCT currency_code_from AS currency')
            ->where('sys_name', 'openexchangerates')
            ->orderBy('currency')
            ->get();   

Я надеюсь, что этот способ сократит время выполнения.

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