9.3 KiB
11 – Noch zu tun: Optimierungen
Stand: 2026-04-29
Kontext: Admin-Performance, Livewire/Volt-Aufteilung, Slow-Request-Auswertung
Dieses Dokument fasst die noch offenen Optimierungspunkte nach der bisherigen Admin-Performance-Runde zusammen. Bereits umgesetzt sind u. a. aggregierte Dashboard-Queries, Admin-Statistik-Caches, Fulltext-Suche mit Fallback, kleinere Pagination, optimierte withCount()-Nutzung, Slow-Admin-Request-Logging, eigener admin_slow-Log-Kanal, Artisan-Report und eine Admin-Report-Seite.
1. Slow-Admin-Reports mit echten Daten auswerten
Priorität: hoch
Ziel: Nicht weiter auf Verdacht optimieren, sondern anhand echter Slow-Requests.
Aktueller Stand
Slow Admin Requests werden in den eigenen Daily-Log-Kanal geschrieben:
storage/logs/admin-slow-*.log
Die Auswertung ist verfügbar über:
php artisan admin:slow-requests
und im Admin unter:
Reports > Performance
Noch zu tun
- Admin mit realistischem Datenbestand bedienen.
- Typische langsame Seiten gezielt öffnen:
- Dashboard
- Benutzerliste
- Benutzer bearbeiten
- Firmenliste
- Firma anzeigen
- Kontakte
- Pressemitteilungen
- Reports > Performance
- Danach den Report auswerten:
php artisan admin:slow-requests --top=20 --limit=50
- Auffällige Routen priorisieren:
- höchste
duration_ms - höchste
database_time_ms - höchste
query_count - wiederkehrende Slow Queries
- höchste
Ergebnis
Die nächsten Optimierungen sollten aus dem Report abgeleitet und nicht pauschal durchgeführt werden.
2. EXPLAIN für Top-Slow-Queries prüfen
Priorität: hoch
Ziel: Sicherstellen, dass neue Indexe und Fulltext-Indexe von MySQL/PostgreSQL tatsächlich genutzt werden.
Aktueller Stand
Der Slow-Request-Reporter versucht für SELECT/CTE-Slow-Queries automatisch ein EXPLAIN bzw. bei SQLite EXPLAIN QUERY PLAN.
Noch zu prüfen
Besonders relevant sind Queries auf:
press_releasescompaniescontactsuserscategoriescategory_translations
Prüffragen
- Wird bei Suchabfragen der Fulltext-Index genutzt?
- Wird bei Listen
ORDER BY created_at/ORDER BY idein passender Index genutzt? - Sind Sortierung und Filter in derselben Index-Reihenfolge abgedeckt?
- Gibt es noch
SCAN TABLE/ Full Table Scans auf großen Tabellen? - Gibt es
whereHas()/has()-Queries, die durchdistinct()/Aggregationen ersetzt werden sollten?
Mögliche Folgearbeiten
- Zusätzliche zusammengesetzte Indexe ergänzen.
- Sortier-/Filterkombinationen in Listen begrenzen.
- Query-Formulierungen vereinfachen, wenn der Planner Indexe nicht nutzt.
3. Livewire-Komponenten gezielt aufteilen
Priorität: hoch bis mittel
Ziel: Große Admin-Komponenten wartbarer machen und teure Teilbereiche als Livewire-Inseln isolieren.
Livewire-Aufteilung ist nicht pauschal ein Performance-Gewinn. Sie lohnt sich vor allem, wenn ein Teilbereich eigene Daten lädt, eigene Live-Suche hat oder unabhängig rerendern kann.
3.1 admin.users.edit aufteilen
Priorität: hoch
Datei: resources/views/livewire/admin/users/edit.blade.php
Diese Komponente ist der größte Refactoring-Kandidat. Sie bündelt derzeit:
- User-Basisdaten
- Profil
- Rollen
- Firmenzuordnung
- Kontaktzuordnung
- Kontaktbearbeitung
- Rechnungsadresse
- Live-Suchen
- direkte Persistierung bei Link/Unlink-Aktionen
Empfohlenes Zielbild
admin.users.edit bleibt Page-Wrapper für:
- User-ID
- Basisdaten
- Save-Flow
- grobe Navigation / Layout
Auslagern:
-
admin.users.partials.profile-form- zunächst Blade-Partial ohne eigenes Livewire
- geringes Risiko
-
admin.users.partials.billing-address-form- zunächst Blade-Partial ohne eigenes Livewire
- geringes Risiko
-
admin.users.company-links- eigene Volt-Komponente
- verwaltet Firmen-Live-Suche, Rollen pro Firma, Link/Unlink
- reduziert Rerenders im Hauptformular
-
admin.users.contact-links- eigene Volt-Komponente
- verwaltet Kontakt-Live-Suche und Kontakt-Zuordnung
- sollte nach
company-linksumgesetzt werden
Empfohlene Reihenfolge
- Nur Blade-Partials extrahieren, keine Logik ändern.
- Tests unverändert laufen lassen.
- Firmenzuordnung in eigene Komponente ziehen.
- Kontaktzuordnung in eigene Komponente ziehen.
- Danach Slow-Reports vergleichen.
Risiken
- Aktuell persistieren Link/Unlink-Aktionen direkt.
- Firmen- und Kontaktzuordnung hängen fachlich zusammen.
- Zu starke Trennung kann Events/State-Synchronisierung unnötig komplex machen.
Deshalb nur schrittweise aufteilen.
4. companies.show Kontakte-Tab isolieren
Priorität: mittel
Datei: resources/views/livewire/admin/companies/show.blade.php
Aktueller Stand
Die Komponente lädt Übersichtsdaten, Pressemitteilungen, User, Counts und bei aktivem Kontakte-Tab zusätzlich Kontakte und Kontakt-Lookup.
Zielbild
admin.companies.show bleibt für:
- Firmenkopf
- Übersicht
- Pressemitteilungen
- User-Zuordnungen
Neue Komponente:
admin.companies.contacts-tab
Aufgaben:
- Kontaktliste laden
- Kontakt-Suche
- vorhandene Kontakte zuordnen
- Limit-/Hinweislogik für große Kontaktmengen
Nutzen
- Kontakte-Tab lädt unabhängig.
- Suchen im Kontakte-Tab rerendern nicht die komplette Firmen-Detailseite.
- Klarere Verantwortlichkeit.
5. Listen erst nach Messwerten weiter aufteilen
Priorität: mittel bis niedrig
Diese Komponenten sind bereits deutlich optimiert und sollten nicht ohne Slow-Report-Befund refactored werden:
admin.usersadmin.contacts.indexadmin.companies.indexadmin.press-releases.indexadmin.categories.index
Bereits umgesetzt
simplePaginate(50)- aggregierte Stats
- zentrale Cache-Invalidierung
- Fulltext-Suche mit Fallback
- limitierte Combobox-/Lookup-Ergebnisse
withCount()nur gezielt oder nachträglich für sichtbare Datensätze
Noch möglich
Nur bei messbarer Langsamkeit:
- weitere Sortieroptionen begrenzen
- zusätzliche zusammengesetzte Indexe
- einzelne Filter als eigene Komponenten
- Export-/Bulk-Actions asynchronisieren
6. Billing-Bereiche finalisieren
Priorität: mittel
Dateien:
resources/views/livewire/admin/invoices/index.blade.phpresources/views/livewire/admin/payments/index.blade.phpresources/views/livewire/admin/coupons/index.blade.php
Aktueller Stand
Diese Bereiche enthalten noch Dummy-/Platzhalterdaten.
Noch zu tun bei echter Implementierung
- echte Models anbinden
simplePaginate()statt Vollmengen- aggregierte Stats statt Einzelcounts
- Indexe für Filter/Sortierung
- Suchfilter mit passenden Datenbankindizes
- Tests für Filter, Pagination und Berechtigungen
7. Rollen-Index nur bei Bedarf optimieren
Priorität: niedrig
Datei: resources/views/livewire/admin/roles/index.blade.php
Aktueller Stand
Die Rollenübersicht lädt alle Rollen mit:
withCount(['users', 'permissions'])
Das ist bei wenigen Systemrollen unproblematisch.
Optimieren, falls:
- viele Custom-Rollen entstehen
- der Slow-Report
admin.roles.indexauffällig zeigt
Mögliche Maßnahmen
- Pagination
- Cache für Rollenübersicht
- Counts nur bei Bedarf anzeigen
8. Optional: Slow-Requests zusätzlich in Datenbank persistieren
Priorität: optional
Ziel: Langfristige Trends statt reiner Log-Auswertung.
Aktueller Stand
Logs sind bewusst schlank und reichen für Debugging.
Datenbank wäre sinnvoll, wenn:
- historische Trends benötigt werden
- Performance-Regressionen über Releases verglichen werden sollen
- Reports filterbar über längere Zeiträume bleiben müssen
- Log-Rotation Daten zu früh entfernt
Mögliche Tabelle
admin_slow_requests
Felder:
route_namepathmethodstatus_codeuser_idduration_msdatabase_time_msquery_countslow_queriesJSONrequested_at
Vorerst nicht zwingend notwendig.
9. Optional: Report-UI erweitern
Priorität: niedrig bis mittel
Die neue Seite Reports > Performance kann später erweitert werden um:
- CSV-Export
- Zeitraum-Schnellfilter: heute, 7 Tage, 30 Tage
- Gruppierung nach Tag/Stunde
- direkte Links zu Admin-Routen, sofern Parameter rekonstruierbar sind
- Badges für Schwellenwerte
- Vergleich vor/nach Optimierung
10. Empfohlene nächste Umsetzung
Wenn keine neuen Slow-Report-Befunde vorliegen:
users.editin Blade-Partials für Profil und Rechnungsadresse aufteilen.- Tests unverändert laufen lassen.
- Firmenzuordnung als eigene Volt-Komponente extrahieren.
- Kontaktzuordnung als eigene Volt-Komponente extrahieren.
- Danach Slow-Report erneut vergleichen.
Wenn Slow-Report-Befunde vorliegen:
- langsamste Route identifizieren.
- Top-Slow-Queries mit EXPLAIN prüfen.
- nur diese Route/Query optimieren.
- Test ergänzen.
- erneute Messung.
11. Aktuelle Empfehlung
Der nächste konkrete Code-Schritt sollte sein:
admin.users.edit refactor phase 1
Umfang:
- Profil-Formular in Partial auslagern
- Rechnungsadresse in Partial auslagern
- keine Logikänderung
- bestehende
UserManagementTest-Tests weiterverwenden
Danach:
admin.users.company-links als eigene Volt-Komponente
Das bringt den besten Mix aus Wartbarkeit, geringerem Rerender-Risiko und überschaubarem Refactoring-Risiko.