PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Quanto è efficiente ordinare per distanza (intera tabella) in geodjango

Se vuoi ordinare ogni voce su quel tavolo in base alla distanza, sarà lento come previsto e non c'è nulla che si possa fare (di cui sono a conoscenza a questo punto del tempo e delle mie conoscenze.)!

Puoi rendere il tuo calcolo più efficiente seguendo questi passaggi e facendo alcune ipotesi:

  1. Abilita indicizzazione spaziale sulle tue tavole Per farlo in GeoDjango, segui il istruzioni sul documento e adattali al tuo modello:

  2. Ora puoi restringere la tua query con alcuni vincoli logici:

    Es: Il mio utente non cercherà persone a più di 50 km dalla sua posizione attuale.

  3. Restringi la ricerca utilizzando dwithin ricerca spaziale che utilizza la summenzionata indicizzazione spaziale , quindi è abbastanza veloce.

  4. Infine applica la distance ordina per nelle righe rimanenti.

La query finale può assomigliare a questa:

current_location = me.location
people = People.objects.filter(
    location__dwithin=(current_location, D(km=50))
).annotate(
    distance=Distance('location', current_location)
).order_by('distance')

PS: Piuttosto che creare un tentativo di impaginazione personalizzato, è più efficiente utilizzare i metodi di impaginazione forniti per le viste django:

Oppure puoi usare Django Rest Framework e usarne l'impaginazione: