Ho questa parte del codice nel mio API che recentemente è diventato un po 'collo di bottiglia:Django: come contare un queryset e restituire una slice senza colpire DB due volte?
total = results.count()
if request.GET.has_key('offset'):
offset = int(request.GET.get('offset').strip())
results = results.order_by('name')[100*offset:100*(offset+1)]
people = list(results)
Nota che results
è il set di query di tutte le persone e offset
è un parametro utilizzato per l'impaginazione.
Qui posso vedere, quando stampo connection.queries
, che il mio database viene colpito due volte da .count()
e list(results)
. Il motivo per cui .count()
deve essere al top perché ho bisogno della lunghezza di tutte le persone (non 100.) C'è un modo per aggirare questo?
Dove esattamente stai usando 'total'? – Jkdc
[MySQL può farlo] (https://stackoverflow.com/a/2439870/1248008), ma non so come utilizzarlo utilizzando Django e non sono sicuro che altri database supportino questo. –
@JonasWielicki È discutibile se ciò acceleri anche molto le cose; vedere: https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/ - un modo migliore per risolvere il problema qui potrebbe essere capire innanzitutto perché quelle query sono mettendoci troppo tempo. Indici appropriati possono farti fare molto. –