Performance
Een groeiende Laravel-applicatie weer snel krijgen
Rapportages en achtergrondprocessen versneld door eerst te meten en daarna opslag, queries en queuewerk opnieuw te verdelen.
De situatie
Een multi-tenant Laravel-applicatie combineert bezoekerssessies, leads, campagnegegevens en conversiepaden in rapportages. Dezelfde PostgreSQL-databases waren tegelijk verantwoordelijk voor dagelijkse transacties, imports en steeds zwaardere analytische vragen.
Waar het vastliep
De vertraging zat niet in één spectaculaire query. Brede selecties, herhaalde attributieberekeningen en rapportagewerk binnen gewone requests stapelden zich op. Daardoor werd een kleine datagroei op meerdere plekken tegelijk voelbaar.
De technische vraag
De applicatie bleef dagelijks in gebruik en klantdata was per bedrijf gescheiden. Iedere verbetering moest dus gefaseerd uitrolbaar zijn, met een terugvalmogelijkheid en tests rond de bestaande rapportage-uitkomsten.
Mijn aanpak
Ik begon met requesttimings en queryplannen in plaats van aannames. Daarna werden samengestelde indexes toegevoegd op de filters die werkelijk voorkwamen, selecties smaller gemaakt en herberekeningen naar idempotente jobs verplaatst. Tijdreeksdata voor dashboards kreeg een eigen ClickHouse-pad, terwijl PostgreSQL de transactionele bron bleef.
Wat het opleverde
De zwaarste rapportagepaden belasten de operationele database niet meer op dezelfde manier. Nieuwe optimalisaties zijn bovendien meetbaar: per request is zichtbaar of tijd in PHP, PostgreSQL, ClickHouse of een externe integratie verdwijnt.
Onder de motorkap
Keuzes die het verschil maakten
Meten vóór wijzigen
Requesttimings, queryplannen en jobduur bepalen waar optimalisatiewerk werkelijk verschil maakt.
Indexes op gebruik
Samengestelde indexes volgen tenant-, bron- en datumfilters uit echte rapportages, niet losse kolommen op gevoel.
Asynchrone herberekening
Attributie en imports worden buiten de webrequest uitgevoerd en kunnen veilig opnieuw worden gestart.
Opslag per taak
De operationele waarheid blijft relationeel; grote aggregaties krijgen een analytisch pad.