È possibile utilizzare il Debugbar Laravel per identificare i problemi di query N+1 nell'applicazione Laravel seguendo questi passaggi e comprendendo le funzionalità che fornisce:
Qual è il problema della query N+1?
Il problema della query N+1 si verifica quando l'applicazione esegue una query per recuperare una serie di record (N), quindi esegue una query aggiuntiva per ciascun record per recuperare i dati correlati, con conseguente totale delle query N+1. Ciò porta alla degradazione delle prestazioni a causa di eccessive query di database [4] [5].Utilizzo di Laravel Debugbar per rilevare N+1 query
- Installazione e configurazione: in primo luogo, installa Laravel Debugbar tramite compositore se non già installato. Si integra perfettamente con Laravel e fornisce un'interfaccia visiva per monitorare le query eseguite durante una richiesta [1] [5].
- Monitoraggio delle query in tempo reale: Laravel Debugbar mostra tutte le query SQL eseguite in una richiesta, incluso il numero di domande e il loro tempo di esecuzione. Ciò consente di individuare quando molte query simili vengono eseguite ripetutamente, un segno distintivo di N+1 problemi [1] [5].
- Informazioni dettagliate sulla query: DebugBar fornisce informazioni dettagliate su ciascuna query, incluso il numero e il numero di riga nel codice in cui è stata attivata la query. Questo aiuta a individuare il codice esatto causando le query N+1, il che è prezioso in progetti più grandi [8].
- Messaggi personalizzati per le query N+1: se combinati con il pacchetto di rivelatore di query Laravel (che si integra con Debugbar), può evidenziare esplicitamente le query N+1 aggiungendo avvertimenti o messaggi all'interno dell'interfaccia di Debugbar. Questo pacchetto rileva quando una query di relazione viene eseguita più di un numero di soglia di volte e ti avvisa di aggiungere caricamento desideroso [2] [3].
come utilizzare Debugbar per identificare le query N+1
1. Abilita Debugbar in Sviluppo: assicurarsi che Debugbar sia abilitato nell'ambiente locale o di sviluppo per evitare di esporre i dettagli delle query nella produzione.
2. Carica la pagina o il percorso che si desidera testare: vai alla pagina sospettata di avere problemi N+1.
3. Apri il pannello Debugbar: nell'interfaccia Debugbar (di solito nella parte inferiore del browser), vai alla scheda "Queries".
4. Osserva il numero di query: cerca query ripetute che sono simili ma differiscono per i valori dei parametri, indicando più query che recuperano dati correlati uno per uno.
5. Controllare le origini delle query: fare clic sulle singole query per visualizzare la traccia dello stack o il numero di file/riga in cui è stata eseguita la query. Questo aiuta a identificare il ciclo esatto o la sezione del codice causando il problema N+1.
6. Utilizzare il rivelatore di query Laravel per gli avvisi: facoltativamente, installare il pacchetto di rivelatore di query Laravel che può aggiungere avvisi all'interno di Debugbar quando vengono rilevate le query N+1, rendendo più facile individuare senza conteggiare manualmente le query [3].
Best practice dopo l'identificazione
- Usa il caricamento entusiasta (`con ()`) nelle tue query eloquenti per precaricare i modelli correlati e ridurre il numero di domande.
-Usa la prevenzione integrata di Laravel aggiungendo `Modello :: PreventLazyLoading (! App ()-> isProduction ())` Nel tuo `appserviceProvider` per lanciare eccezioni sul carico pigro durante lo sviluppo, aiutando a catturare N+1 query Early [4] [9].
- Monitorare continuamente le query con Debugbar durante lo sviluppo per mantenere prestazioni di query ottimali.
Sfruttando la visualizzazione delle query di Laravel Debugbar e integrando strumenti come il rilevatore di query Laravel, è possibile identificare e risolvere in modo efficiente i problemi di query N+1, migliorando significativamente le prestazioni del database dell'applicazione [1] [2] [3] [5].
Citazioni:
[1] https://www.luckymedia.dev/blog/laravel-for-beginners-query-performance-isses
[2] https://github.com/beyondcode/laravel-query-dector
[3] https://beyondco.de/docs/laravel-query-detector/usage
[4] https://laravel-news.com/laravel-n1-query-robles
[5] https://www.linkedin.com/pulse/handling-n1-query-problem-laravel-developers-haseeb-mushtaq-udusf
[6] https://laraveldaily.com/lesson/laravel-eloquent-expert/n1-query-packages-examples
[7] https://laraveldaily.com/lesson/eloquent-performance/n1-query-debugbar-eager-loading
[8] https://www.reddit.com/r/laravel/comments/5f7y9f/debugging_the_amount_of_database_queries_per/
[9] https://planetscale.com/blog/what-is-1-1-query-problem-and-how-to-to-sol-it