Django ORM ક્વેરીઝનું ઓપ્ટિમાઇઝેશન
Django ORM ડેટાબેઝનું કામ સરળ બનાવે છે. પરંતુ તે એક જોખમ છુપાવે છે. જો તમે સંબંધિત (related) ઓબ્જેક્ટ્સને ખોટી રીતે ફેચ કરો છો, તો તમે N+1 ક્વેરી સમસ્યા ઊભી કરો છો.
આનો અર્થ એ છે કે જો તમે 100 પોસ્ટ્સ ફેચ કરો છો, તો તમારી એપ 101 ક્વેરીઝ ચલાવી શકે છે. આ તમારી એપની ગતિ ધીમી કરી દે છે.
તેને સુધારવા માટે આ બે ટૂલ્સનો ઉપયોગ કરો:
- select_related
આનો ઉપયોગ ForeignKey અને OneToOneField માટે કરો.
તે SQL JOIN નો ઉપયોગ કરે છે. તે સિંગલ ક્વેરીમાં સંબંધિત ડેટા મેળવે છે.
- ઉદાહરણ: Post પાસે એક Author છે.
- સામાન્ય રીત: 100 પોસ્ટ્સ માટે 101 ક્વેરીઝ.
- ઓપ્ટિમાઇઝ્ડ રીત: .select_related("author") નો ઉપયોગ કરીને 1 ક્વેરી.
- prefetch_related
આનો ઉપયોગ ManyToManyField અને reverse ForeignKeys માટે કરો.
તે અલગ-અલગ ક્વેરીઝ ચલાવે છે અને તેને Python માં જોડે છે.
- ઉદાહરણ: Post પાસે ઘણા Tags છે.
- સામાન્ય રીત: પોસ્ટ્સ માટે 1 ક્વેરી + દરેક પોસ્ટના ટેગ્સ માટે 1 ક્વેરી.
- ઓપ્ટિમાઇઝ્ડ રીત: .prefetch_related("tags") નો ઉપયોગ કરીને કુલ 2 ક્વેરીઝ.
Pro Tips:
- તમારા લૂપમાં પહોંચતા પહેલા સંબંધિત ડેટાને ફિલ્ટર કરવા માટે Prefetch object નો ઉપયોગ કરો.
- તેમને એકસાથે ચેઈન કરો. તમે એકસાથે authors અને tags મેળવવા માટે એક જ queryset માં બંનેનો ઉપયોગ કરી શકો છો.
- લૂપની અંદર prefetched રિલેશનશિપ પર .filter() કોલ કરવાનું ટાળો. આ કેશ (cache) ને બાયપાસ કરે છે અને ફરીથી ડેટાબેઝને એક્સેસ કરે છે.
- તમને જરૂરી કોલમ્સ જ ફેચ કરવા માટે select_related સાથે .only() નો ઉપયોગ કરો.
Summary:
- ForeignKey / OneToOne: select_related નો ઉપયોગ કરો.
- ManyToMany / Reverse FK: prefetch_related નો ઉપયોગ કરો.
આ સમસ્યાઓને વહેલી તકે શોધવા માટે django-debug-toolbar સાથે તમારી ક્વેરી કાઉન્ટ તપાસો.