Nella nostra applicazione abbiamo una pagina dove elenchiamo le nostre entità con molte opzioni per filtrare e cercare. Nel corso del tempo questa pagina è diventata più lenta e lenta soprattutto per i set di dati di grandi dimensioni, quindi abbiamo pensato a come migliorare le prestazioni. Ho due idee:
- Utilizza un servizio come Elasticsearch creato per problemi come questi (anche se non vorremmo introdurre un'ulteriore dipendenza)
- Implementa il caching corretto
Tuttavia il caching fornisce solo un aumento della velocità se la stessa risorsa viene richiesta due o più volte. In una pagina in cui i record possono essere filtrati in molti modi diversi, tuttavia non credo che l'accelerazione del caching verrà utilizzata spesso a causa della grande varietà con cui i dati verranno filtrati e presentati. E anche se un utente sta richiedendo la pagina utilizzando filtri identici come qualcuno (o se stesso) prima, c'è un'alta probabilità che fino ad allora i dati siano cambiati e quindi la cache non è più valida.
Mi sbaglio nella mia ipotesi? Come sviluppare pagine come queste in modo performante?
Grazie
EDIT:
Ecco qualche informazione in più:
Utilizziamo Ruby on Rails, un database MySQL e l'ORM ActiveRecord. Per una richiesta della pagina citata recuperiamo i dati da circa 10 diverse tabelle di database contenenti ciascuna da 5000 a 5.000.000 di voci. Raramente c'è una ricerca basata sul testo, la maggior parte delle volte cerchiamo filtrando le chiavi esterne come in "Dammi tutti i dipendenti della società XY". Il nostro database è correttamente indicizzato, su questo abbiamo preso molta cura. Ho inoltre effettuato un'analisi approfondita delle query utilizzando la funzionalità MySQL EXPLAIN. Il filtraggio e la preparazione dei dati e delle meta informazioni (ad esempio il conteggio dei record) avviene sul lato server.
Il sito funziona male perché visualizza molte informazioni e quindi deve eseguire diverse query pesanti. Come esempio per una query pesante:
Ottieni tutte le stanze per un certo edificio dove almeno una persona è seduta. Per ottenere questi dati dobbiamo prima recuperare tutte le persone di questo edificio e poi ottenere il conteggio delle persone per ogni stanza per vedere se c'è almeno una persona al suo interno.