From: Daniel Axtens Date: Mon, 12 Mar 2018 11:07:15 +0000 (+1100) Subject: api: EventList: change select_related() to prefetch_related() X-Git-Tag: v2.1.0-rc1~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5d9b00409fcafc7b8cd09400195c9c9f1b3e4fcc;p=thirdparty%2Fpatchwork.git api: EventList: change select_related() to prefetch_related() 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 --- diff --git a/patchwork/api/event.py b/patchwork/api/event.py index 0d97af22..7e04b716 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')