𝗢𝗽𝘁𝗶𝗺𝗶𝘇𝗶𝗻𝗴 𝗗𝗷𝗮𝗻𝗴𝗼 𝗢𝗥𝗠 𝗤𝘂𝗲𝗿𝗶𝗲𝘀

Django ORM डेटाबेस के काम को आसान बनाता है। लेकिन यह एक खतरा भी छिपाए रखता है। यदि आप संबंधित (related) ऑब्जेक्ट्स को गलत तरीके से फेच (fetch) करते हैं, तो आप N+1 query की समस्या पैदा कर देते हैं।

इसका मतलब है कि यदि आप 100 पोस्ट फेच करते हैं, तो आपका ऐप 101 क्वेरी चला सकता है। इससे आपका ऐप बहुत धीमा हो सकता है।

इसे ठीक करने के लिए इन दो टूल्स का उपयोग करें:

  1. select_related

इसका उपयोग ForeignKey और OneToOneField के लिए करें।

यह SQL JOIN का उपयोग करता है। यह एक ही क्वेरी में संबंधित डेटा प्राप्त कर लेता है।

  • उदाहरण: Post का एक Author है।
  • Naive तरीका: 100 पोस्ट के लिए 101 क्वेरी।
  • Optimized तरीका: .select_related("author") का उपयोग करके 1 क्वेरी।
  1. prefetch_related

इसका उपयोग ManyToManyField और reverse ForeignKeys के लिए करें।

यह अलग-अलग क्वेरी चलाता है और उन्हें Python में जॉइन (join) करता है।

  • उदाहरण: Post में कई Tags हैं।
  • Naive तरीका: पोस्ट के लिए 1 क्वेरी + हर एक पोस्ट के टैग्स के लिए 1 क्वेरी।
  • Optimized तरीका: .prefetch_related("tags") का उपयोग करके कुल 2 क्वेरी।

Pro Tips:

  • संबंधित डेटा को लूप (loop) में आने से पहले फ़िल्टर करने के लिए Prefetch ऑब्जेक्ट का उपयोग करें।
  • उन्हें एक साथ चेन (chain) करें। आप एक ही queryset में दोनों का उपयोग करके एक साथ authors और tags प्राप्त कर सकते हैं।
  • लूप के अंदर 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