Laravel объединить с нумерацией страниц - PullRequest
0 голосов
/ 16 января 2019

Я использую паравинацию laravel (v-5.6). У меня есть две таблицы: размер таблицы 1 ~ 1,6 миллиона строк и размер таблицы 2 ~ 0,8 миллиона строк. Я выполняю операцию соединения на основании какого-либо условия. Мой запрос выглядит следующим образом -

$results = $connection->table('table1' as db1")
                ->select('db1.id as kuchikomi_id','db1.comment as splitted_kuchikomi','db1.kuchikomi_sentiment','db1.status as kuchikomi_status','db2.id','db2.hotel_id','db2.comment','db2.post_date','db2.ota_name','db2.negative_comment','db2.positive_comment','db2.language')
                ->Join('table2' as db2", 'db1.kuchikomi_id', '=', 'db2.id')
                ->where('db1.kuchikomi_language', $language)
                ->whereIn('db1.id', $splitted_id))
                ->paginate(100);

здесь $ splitted_id - это набор из ~ 0,6 миллионов идентификаторов. Когда я выполняю этот запрос, он занимает более 12 минут и завершается из-за превышения максимального времени выполнения.

индексы table1 -

  • db1.kuchikomi_language
  • db1.id

Мой вопрос: подходит ли операция объединения для таблиц такого размера? Если да, как я могу улучшить время выполнения? Нужна помощь, чтобы выяснить эти сомнения. Спасибо.

1 Ответ

0 голосов
/ 16 января 2019

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

$table->index(['kuchikomi_language', 'id']);

Это ускорит оператор where('db1.kuchikomi_language', $language).

После этого вы можете попытаться использовать фильтр вместо оператора whereIn('db1.id', $splitted_id)), если выполнение этой части запроса занимает много времени. Вы можете проанализировать это с помощью Laravel Debugbar .

Это даст вам возможность кэшировать результаты до и / или после фильтрации разделенных идентификаторов в зависимости от того, сколько времени занимает фильтрация.

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

...