#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();