Filament будує таблицю з Eloquent-запиту, тож усі звичайні проблеми продуктивності лишаються - але ховаються за декларативним синтаксисом.
N+1 у колонках. Колонка зі звʼязком робить запит на рядок:
TextColumn::make('company.name') // + 1 запит на кожен рядок
Лікується модифікацією запиту таблиці:
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()->with(['company', 'technologies']);
}
Лічильники. ->counts('vacancies') замість завантаження всієї колекції заради count().
Дорогі обчислення в state(). Замикання виконується для кожного рядка, тож звернення до бази всередині - те саме N+1, лише написане інакше.
Сортування й пошук за звʼязком роблять join, і без індексу на зовнішньому ключі це помітно:
TextColumn::make('company.name')
->searchable() // where по приєднаній таблиці
->sortable()
Що ще сповільнює адмінку:
->paginated([10, 25, 50, 'all'])з опцієюallна великій таблиці вивантажує все в памʼять одним кліком користувача.- Глобальний пошук по багатьох ресурсах виконує запит на кожен зареєстрований ресурс.
- Мініатюри без кешу:
ImageColumn, що генерує прев'ю на льоту, робить це для кожного рядка. - Опції
Selectбез->searchable()вивантажують усі записи довідника у форму.
Як шукати причину: Debugbar або Telescope на сторінці ресурсу покажуть кількість запитів. Таблиця на 25 рядків має вкладатися в одиниці запитів; десятки - ознака незавантаженого звʼязку.