Django ORM ക്വറികൾ ഒപ്റ്റിമൈസ് ചെയ്യുക
Django ORM ഡാറ്റാബേസ് ജോലികൾ എളുപ്പമാക്കുന്നു. എന്നാൽ ഇതിൽ ഒരു അപകടം ഒളിഞ്ഞിരിപ്പുണ്ട്. സംബന്ധിച്ച ഒബ്ജക്റ്റുകൾ (related objects) ശരിയായ രീതിയിൽ ഫെച്ച് ചെയ്യുന്നില്ലെങ്കിൽ, നിങ്ങൾ N+1 ക്വറി പ്രശ്നം (N+1 query problem) സൃഷ്ടിക്കുന്നു.
ഇതിനർത്ഥം നിങ്ങൾ 100 പോസ്റ്റുകൾ ഫെച്ച് ചെയ്യുന്നുണ്ടെങ്കിൽ, നിങ്ങളുടെ ആപ്പ് 101 ക്വറികൾ പ്രവർത്തിപ്പിച്ചേക്കാം എന്നാണ്. ഇത് നിങ്ങളുടെ ആപ്പിന്റെ വേഗതയെ സാരമായി കുറയ്ക്കും.
ഇത് പരിഹരിക്കാൻ ഈ രണ്ട് ടൂളുകൾ ഉപയോഗിക്കുക:
select_related
ForeignKey, OneToOneField എന്നിവയ്ക്കായി ഇത് ഉപയോഗിക്കുക.
ഇത് ഒരു SQL JOIN ഉപയോഗിക്കുന്നു. ഇത് ഒറ്റ ക്വറിയിലൂടെ സംബന്ധിച്ച ഡാറ്റ ലഭ്യമാക്കുന്നു.
- ഉദാഹരണം: ഒരു Post-ന് ഒരു Author ഉണ്ട്.
- സാധാരണ രീതി (Naive way): 100 പോസ്റ്റുകൾക്കായി 101 ക്വറികൾ.
- ഒപ്റ്റിമൈസ് ചെയ്ത രീതി (Optimized way):
.select_related("author")ഉപയോഗിച്ച് 1 ക്വറി മാത്രം.
prefetch_related
ManyToManyfield, reverse ForeignKeys എന്നിവയ്ക്കായി ഇത് ഉപയോഗിക്കുക.
ഇത് പ്രത്യേക ക്വറികൾ പ്രവർത്തിപ്പിക്കുകയും അവ Python-ൽ ജോയിൻ ചെയ്യുകയും ചെയ്യുന്നു.
- ഉദാഹരണം: ഒരു Post-ന് നിരവധി Tags ഉണ്ട്.
- സാധാരണ രീതി (Naive way): പോസ്റ്റുകൾക്കായി 1 ക്വറി + ഓരോ പോസ്റ്റിന്റെയും ടാഗുകൾക്കായി ഓരോ ക്വറി വീതം.
- ഒപ്റ്റിമൈസ് ചെയ്ത രീതി (Optimized way):
.prefetch_related("tags")ഉപയോഗിച്ച് ആകെ 2 ക്വറികൾ മാത്രം.
Pro Tips:
- ലൂപ്പിനുള്ളിലേക്ക് എത്തുന്നതിന് മുമ്പ് സംബന്ധിച്ച ഡാറ്റ ഫിൽട്ടർ ചെയ്യാൻ
Prefetchഒബ്ജക്റ്റ് ഉപയോഗിക്കുക. - ഇവ ഒന്നിച്ച് ഉപയോഗിക്കാം (Chain them together). ഒരേസമയം authors-ഉം tags-ഉം ലഭിക്കാൻ ഒരു queryset-ൽ ഇവ രണ്ടും ഉപയോഗിക്കാം.
- ലൂപ്പിനുള്ളിൽ ഒരു prefetched relationship-ൽ
.filter()വിളിക്കുന്നത് ഒഴിവാക്കുക. ഇത് കാഷെ (cache) ബൈപാസ് ചെയ്യുകയും വീണ്ടും ഡാറ്റാബേസിലേക്ക് കണക്ട് ചെയ്യുകയും ചെയ്യുന്നു. - നിങ്ങൾക്ക് ആവശ്യമുള്ള കോളങ്ങൾ മാത്രം ലഭിക്കാൻ
select_related-നോടൊപ്പം.only()ഉപയോഗിക്കുക.
Summary:
- ForeignKey / OneToOne:
select_relatedഉപയോഗിക്കുക. - ManyToMany / Reverse FK:
prefetch_relatedഉപയോഗിക്കുക.
ഇത്തരം പ്രശ്നങ്ങൾ നേരത്തെ കണ്ടെത്താൻ django-debug-toolbar ഉപയോഗിച്ച് നിങ്ങളുടെ ക്വറി എണ്ണം പരിശോധിക്കുക.