[PATCH 1/2] api: EventList: change select_related() to prefetch_related()
Daniel Axtens
dja at axtens.net
Mon Mar 12 23:37:36 AEDT 2018
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 output) + Postgres w/ ~100k patches,
request time went from 1.5s to 0.25s, a 6x speedup.
Tested with cURL (JSON output) + 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