Как рефакторинговать Красноречивый запрос Laravel

#mysql #laravel #database #eloquent #laravel-8

Вопрос:

У меня есть запрос, который извлекает данные из 5 таблиц с помощью соединений. Хотя я получаю правильный результат, это происходит довольно медленно.

Таблицы:

  • data_bundles
  • поставщики
  • ussd_строки
  • пользователи продуктов
  • data_bundle_категория

Как я могу это реорганизовать?

Кроме того, в настройке не используются модели.

 $data_bundle_transaction = DB::table('data_bundles')  -gt;select('*','data_bundles.phone_number as data_bundles_phone_number')  -gt;join('vendors','vendors.vendor_id','=','data_bundles.vendor_id')  -gt;join('ussd_strings','data_bundles.product_id','=','ussd_strings.product_id')  -gt;join('products','data_bundles.product_id','=','products.product_id')  -gt;join('users','users.user_id','=','data_bundles.user_id')  -gt;leftJoin('data_bundle_category', 'data_bundle_category.product_id', '=', 'data_bundles.product_id')  -gt;where('data_bundles.status',0)  -gt;where('data_bundles.network','like', '%' . $request-gt;network.'%')  -gt;where('data_bundle_category.data_category', '=', $request-gt;type)-gt;first();  

Комментарии:

1. Какой рефакторинг вы хотите сделать? Пожалуйста, поделитесь тем, чего вы хотите достичь.

2. В настоящее время выполнение запроса занимает много времени. Мне нужен тот, который улучшает скорость.

3. Пожалуйста, проверьте, есть ли у столбцов в предложениях where индекс. Такие столбцы, как статус, сеть и категория данных из таблицы data_bundles.

4. В этих столбцах нет индексов

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

Ответ №1:

Вы можете попробовать использовать объединения с несколькими условиями, таким образом вы объедините меньше данных и запрос будет выполняться быстрее

 $data_bundle_transaction = DB::table('data_bundles') -gt;select('*','data_bundles.phone_number as data_bundles_phone_number') -gt;join('vendors','vendors.vendor_id','=','data_bundles.vendor_id') -gt;join('ussd_strings','data_bundles.product_id','=','ussd_strings.product_id') -gt;join('products','data_bundles.product_id','=','products.product_id') -gt;join('users','users.user_id','=','data_bundles.user_id') -gt;leftJoin('data_bundle_category', function() use ($request){  $join-gt;on('data_bundle_category.product_id', '=', 'data_bundles.product_id');  $join-gt;on('data_bundle_category.data_category', '=', $request-gt;type); }) -gt;where('data_bundles.status',0) -gt;where('data_bundles.network','like', '%' . $request-gt;network.'%') -gt;first();