PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Quão eficiente é ordenar por distância (tabela inteira) no geodjango


Se você quiser classificar todas as entradas nessa tabela por distância, será lento como esperado e não há nada que possa ser feito (que eu saiba neste momento e meu conhecimento.)!

Você pode tornar seu cálculo mais eficiente seguindo estas etapas e fazendo algumas suposições:

  1. Ative a indexação espacial em suas mesas. Para fazer isso no GeoDjango, siga o instruções do documento e ajustá-los ao seu modelo:

  2. Agora você pode restringir sua consulta com algumas restrições lógicas:

    Ex: Meu usuário não procurará pessoas a mais de 50km de sua posição atual.

  3. Restrinja a pesquisa usando dwithin pesquisa espacial que utiliza o acima mencionado indexação espacial , portanto, é bastante rápido.

  4. Por fim, aplique a distance ordenar por nas linhas restantes.

A consulta final pode ficar assim:
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: Em vez de criar uma tentativa de paginação personalizada, é mais eficiente utilizar os métodos de paginação fornecidos para as visualizações do django:

Ou você pode usar o Django Rest Framework e usar sua paginação: