Mam ten fragment kodu w moim API, który niedawno stał się nieco gardłem:Django: Jak policzyć zestaw zapytań i zwrócić plaster, nie uderzając dwukrotnie w DB?
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)
Zauważ, że results
jest queryset wszystkich ludzi i offset
param jest stosowany do paginacji.
Tutaj mogę zobaczyć, kiedy wydrukuję connection.queries
, że moja baza danych zostanie dwukrotnie trafiony przez .count()
i list(results)
. Powód, dla którego .count()
musi być na górze, ponieważ potrzebuję do tego całej długości ludzi (nie 100.) Czy istnieje sposób na obejście tego?
Gdzie dokładnie używasz słowa "total"? – Jkdc
[MySQL może to zrobić] (https://stackoverflow.com/a/2439870/1248008), ale nie wiem jak tego użyć przy użyciu django i nie jestem pewien, czy inne bazy danych obsługują to. –
@ JonasWielicki Jest dyskusyjne, czy to jeszcze przyspieszy rzeczy; zobacz: https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/ - lepszym sposobem rozwiązania tego problemu może być najpierw zrozumienie, dlaczego te zapytania są zbyt długo. Odpowiednie wskaźniki mogą Ci pomóc. –