[PATCH v2 1/2] api: EventList: change select_related() to prefetch_related()
Daniel Axtens
dja at axtens.net
Thu Apr 5 19:37:32 AEST 2018
These are conceptually compatible with Stephen's ongoing refactoring,
whether or not we go ahead with that in the end, this at least doesn't
close it off. Applied.
Regards,
Daniel
Daniel Axtens <dja at axtens.net> writes:
> select_related() creates a single giant query that JOINs the required
> tables together in the DB. prefetch_related() does a similar thing,
> but at the Django layer - for all referenced models, it makes a
> separate query to the DB to fetch them.
>
> This massively, massively simplifies the job the DB has to do:
> instead of creating a massive, sparse results table with many
> columns, we do 1 query for the events, and then query for only
> patches/cover letters/series/projects etc referenced in those 30
> events.
>
> Tested with cURL + JSON renderer + Postgres w/ ~100k patches,
> request time went from 1.5s to 0.25s, a 6x speedup.
>
> Tested with cURL + JSON renderer + MySQL w/ ~33k patches,
> request time went from ~2.2s to ~0.20s, an ~11x speedup.
>
> Signed-off-by: Daniel Axtens <dja at axtens.net>
> ---
> patchwork/api/event.py | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/patchwork/api/event.py b/patchwork/api/event.py
> index 0d97af227f0e..7e04b716af1a 100644
> --- a/patchwork/api/event.py
> +++ b/patchwork/api/event.py
> @@ -96,7 +96,7 @@ class EventList(ListAPIView):
>
> def get_queryset(self):
> return Event.objects.all()\
> - .select_related('project', 'patch', 'series', 'cover',
> - 'previous_state', 'current_state',
> - 'previous_delegate', 'current_delegate',
> - 'created_check')
> + .prefetch_related('project', 'patch', 'series', 'cover',
> + 'previous_state', 'current_state',
> + 'previous_delegate', 'current_delegate',
> + 'created_check')
> --
> 2.14.1
More information about the Patchwork
mailing list