Django ORM ക്വറികൾ ഒപ്റ്റിമൈസ് ചെയ്യുക

Django ORM ഡാറ്റാബേസ് ജോലികൾ എളുപ്പമാക്കുന്നു. എന്നാൽ ഇതിൽ ഒരു അപകടം ഒളിഞ്ഞിരിപ്പുണ്ട്. സംബന്ധിച്ച ഒബ്‌ജക്റ്റുകൾ (related objects) ശരിയായ രീതിയിൽ ഫെച്ച് ചെയ്യുന്നില്ലെങ്കിൽ, നിങ്ങൾ N+1 ക്വറി പ്രശ്നം (N+1 query problem) സൃഷ്ടിക്കുന്നു.

ഇതിനർത്ഥം നിങ്ങൾ 100 പോസ്റ്റുകൾ ഫെച്ച് ചെയ്യുന്നുണ്ടെങ്കിൽ, നിങ്ങളുടെ ആപ്പ് 101 ക്വറികൾ പ്രവർത്തിപ്പിച്ചേക്കാം എന്നാണ്. ഇത് നിങ്ങളുടെ ആപ്പിന്റെ വേഗതയെ സാരമായി കുറയ്ക്കും.

ഇത് പരിഹരിക്കാൻ ഈ രണ്ട് ടൂളുകൾ ഉപയോഗിക്കുക:

  1. select_related

ForeignKey, OneToOneField എന്നിവയ്ക്കായി ഇത് ഉപയോഗിക്കുക.

ഇത് ഒരു SQL JOIN ഉപയോഗിക്കുന്നു. ഇത് ഒറ്റ ക്വറിയിലൂടെ സംബന്ധിച്ച ഡാറ്റ ലഭ്യമാക്കുന്നു.

  • ഉദാഹരണം: ഒരു Post-ന് ഒരു Author ഉണ്ട്.
  • സാധാരണ രീതി (Naive way): 100 പോസ്റ്റുകൾക്കായി 101 ക്വറികൾ.
  • ഒപ്റ്റിമൈസ് ചെയ്ത രീതി (Optimized way): .select_related("author") ഉപയോഗിച്ച് 1 ക്വറി മാത്രം.
  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 ഉപയോഗിച്ച് നിങ്ങളുടെ ക്വറി എണ്ണം പരിശോധിക്കുക.

Source: https://dev.to/fhva29/optimizing-django-orm-queries-a-practical-guide-to-selectrelated-and-prefetchrelated-1gpl