Laravel: как оптимизировать несколько запросов

Запросы к файлу HomeController замедляют работу сайта. Для полной загрузки страницы требуется 20 секунд. (Размер страницы составляет всего 3,9 Мб, а загрузка процессора увеличивается до 80% каждый раз, когда я загружаю страницу). Мне сказали использовать Query Builder, который работает быстрее, чем Elequant, и объединять запросы, чтобы отправлять их как один запрос. Я нахожу это слишком сложным. Где я могу увидеть некоторые примеры для этого?

HomeController

public function index()
{
$sliders = Post::where('post_type','slider')
->with('FeaturedImage','PostField')
->orderBy('created_at', 'desc')
->limit(4)
->get();

$page1 = Post::where([
['post_type','=','custom_page'],
['slug','=','page1'],
])
->with('FeaturedImage','PostField')
->latest()
->first();$page2 = Post::where([
['post_type','=','custom_page'],
['slug','=','page2'],
])
->with('FeaturedImage','PostField')
->latest()
->first();$page3 = Post::where([
['post_type','=','custom_page'],
['slug','=','page-3'],
])
->with('FeaturedImage','PostField')
->latest()
->first();$compacts = array(
'sliders',
'page1',
'page2',
'page3',
);
return view('site.home')->with(compact($compacts));
}

редактировать:
Почтовая миграция

public function up()
{
// Create table for storing roles
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->integer('author_id');
$table->integer('category_id')->nullable();
$table->string('title');
$table->text('excerpt')->nullable();
$table->text('body')->nullable();
$table->string('slug')->nullable();//unique()
$table->string('post_type')->default('post');
$table->enum('status', ['PUBLISHED', 'DRAFT', 'PENDING'])->default('DRAFT');
$table->timestamps();
});
}

1

Решение

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

Вам нужен индекс на post_type и на slug для ваших условий запроса. Вы можете создать два отдельных индекса или один составной индекс. Это зависит от потребностей вашего приложения.

$table->string('slug')->nullable()->index();
$table->string('post_type')->default('post')->index();
2

Другие решения

Вы можете сделать что-то вроде этого, чтобы получить все страницы, а затем разделить страницы с помощью коллекции группа по() функция

Post::where('post_type','=','custom_page')
->whereIn('slug',['page1','page2','page-3'])
->whereRaw('id IN (select MAX(id) FROM post GROUP BY slug)')
->with('FeaturedImage','PostField')
->get()
->groupBy('slug');
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector