Django ORM வினவல்களை (Queries) மேம்படுத்துதல்
Django ORM தரவுத்தளப் பணிகளை எளிதாக்குகிறது. ஆனால் இதில் ஒரு ஆபத்து மறைந்துள்ளது. நீங்கள் தொடர்புடைய பொருட்களை (related objects) சரியாகக் கையாளவில்லை என்றால், அது N+1 query சிக்கலை உருவாக்கும்.
அதாவது, நீங்கள் 100 பதிவுகளைப் (posts) பெற முயன்றால், உங்கள் செயலி 101 வினவல்களை இயக்கக்கூடும். இது உங்கள் செயலியை மிகவும் மெதுவாக்கும்.
இதைச் சரிசெய்ய இந்த இரண்டு கருவிகளைப் பயன்படுத்தவும்:
- select_related
இதை ForeignKey மற்றும் OneToOneField ஆகியவற்றிற்குப் பயன்படுத்தவும்.
இது ஒரு SQL JOIN-ஐப் பயன்படுத்துகிறது. இது தொடர்புடைய தரவை ஒரே வினவலில் பெறுகிறது.
- உதாரணம்: Post-க்கு ஒரு Author உண்டு.
- சாதாரண முறை: 100 பதிவுகளுக்கு 101 வினவல்கள்.
- மேம்படுத்தப்பட்ட முறை:
.select_related("author")மூலம் 1 வினவல்.
- prefetch_related
இதை ManyToManyField மற்றும் reverse ForeignKeys ஆகியவற்றிற்குப் பயன்படுத்தவும்.
இது தனித்தனி வினவல்களை இயக்கி, அவற்றை Python-இல் இணைக்கிறது.
- உதாரணம்: Post-க்கு பல Tags உண்டு.
- சாதாரண முறை: பதிவுகளுக்கு 1 வினவல் + ஒவ்வொரு பதிவின் Tags-களுக்கும் தலா 1 வினவல்.
- மேம்படுத்தப்பட்ட முறை:
.prefetch_related("tags")மூலம் மொத்தம் 2 வினவல்கள்.
Pro Tips:
- உங்கள் லூப்பிற்குள் (loop) நுழைவதற்கு முன்பே தொடர்புடைய தரவை வடிகட்ட
Prefetchபொருளைப் பயன்படுத்தவும். - அவற்றை ஒன்றாகச் சங்கிலித் தொடராக (chain) இணைக்கலாம். ஒரே
queryset-இல் authors மற்றும் tags இரண்டையும் ஒரே நேரத்தில் பெற இரண்டையும் பயன்படுத்தலாம். - ஒரு லூப்பிற்குள், ஏற்கனவே prefetch செய்யப்பட்ட உறவின் (relationship) மீது
.filter()முறையை அழைப்பதைத் தவிர்க்கவும். இது cache-ஐத் தவிர்த்து மீண்டும் தரவுத்தளத்தைத் தொடர்பு கொள்ளும். - உங்களுக்குத் தேவையான நெடுவரிசைகளை (columns) மட்டும் பெற
select_related-உடன்.only()முறையைப் பயன்படுத்தவும்.
Summary:
- ForeignKey / OneToOne:
select_related-ஐப் பயன்படுத்தவும். - ManyToMany / Reverse FK:
prefetch_related-ஐப் பயன்படுத்தவும்.
இத்தகைய சிக்கல்களை முன்கூட்டியே கண்டறிய django-debug-toolbar மூலம் உங்கள் வினவல் எண்ணிக்கையைச் சரிபார்க்கவும்.