वाई में तेजी से काउंटर

Yii PHP फ्रेमवर्क के 1.1.8 के रिलीज में, काउंटरकटर्स के साथ काम करने के लिए CActiveRecord वर्ग में एक अतिरिक्त तरीका दिखाई दिया, अर्थात् सेवकाउंटर्स। संभवतः आप में से कई ने रिलीज की घोषणा में उसके बारे में पढ़ा। कटौती के तहत, मैं आपको बताता हूं कि इसकी शीतलता क्या है और यह इसके उपयोग के लायक क्यों है। शायद पढ़ने के बाद आप अपने कोड को रिफलेक्टर करेंगे।

SaveCounters की उपस्थिति के बारे में घोषणा में पढ़ने के बाद, मैंने सोचा कि यह मौजूदा कार्यक्षमता के लिए सिर्फ एक आवरण था। न तो विधि के लिए प्रलेखन और न ही प्रदर्शन में सुधार के लिए मैनुअल ने गति के संदर्भ में इसकी किसी भी विशेषता के बारे में कुछ भी कहा। सामान्य तौर पर, मैं पढ़ा और भूल गया।

अक्सर ऐसे कार्य होते हैं जिनमें कुछ डेटा को समय-समय पर एकत्र करना होता है। मेरे मामले में, यह एक साधारण बैनर मोड़ था। जब बैनर प्रदर्शित किया गया था, तो एक पंक्ति को कच्ची तालिका में जोड़ा गया था। मुकुट पर एक स्क्रिप्ट लगाई गई थी, जो एक चक्र में कच्चे डेटा के माध्यम से चलती थी और विशेष रूप से, बैनर की छाप को बढ़ाती थी। लूप के अंदर यह कोड था:
$banner->hits++; $banner->save(); 

सब कुछ बहुत अच्छा हुआ, लेकिन लोड के साथ समस्याएं बढ़ने लगीं। मुकुट लिपि समय से बाहर चल रही थी, समय के साथ गिरने लगी। प्रोफाइलिंग और साइंटिफिक पोकिंग की प्रक्रिया में, स्क्रिप्ट तर्क बदल गया, उपरोक्त कोड के टुकड़े को छोड़कर सब कुछ बदल गया। वह संदेह से परे था। जैसा कि यह निकला, व्यर्थ में।

यह तब था कि मुझे विशेष सेवकों की विधि याद थी। इस कोड के साथ एक स्क्रिप्ट स्क्रिप्ट के प्रदर्शन के साथ सभी समस्याओं को हल:
 //    " "=>"  " $banner->saveCounters(array('hits'=>1)); 

मैं समस्या के इस समाधान पर आश्चर्यचकित था और तरीकों के प्रदर्शन की तुलना करने का फैसला किया, साथ ही उनके कोड को भी देखा।
परीक्षण वातावरण: core2 6420, ram 3gb, मानक सेटिंग्स के साथ Zend सर्वर CE 5.5।
टेस्ट कोड:
 $start = microtime(true); for($i=0;$i<1000;$i++) { $banner->hits++; $banner->save();  $banner->saveCounters(array('hits'=>1)); } echo microtime(true)-$start; 

कई माप किए गए, परिणाम इस प्रकार हैं:
- सहेजें () ~ 39 सेकंड
- saveCounters () ~ 23 सेकंड
यानी saveCounters ~ 41% तेज है!

तो क्या रहस्य है?

सब कुछ बहुत सरल निकला। SaveCounter विधि कोड सरल है, लेकिन यह बात नहीं है। मुख्य बात यह है कि इन विधियों से एसक्यूएल प्रश्न क्या बनते हैं।

सहेजें () विधि एक भारी क्वेरी उत्पन्न करती है, जिसमें तालिका के सभी फ़ील्ड शामिल हैं।
कुछ इस तरह:
 UPDATE `banners` SET `id`=1, `name`='test', `info`='long-long description', `hits`=3560, `iduser`='2', `created_at`='2012-02-17 13:14:02', ... WHERE `banners`.`id`=1 

SaveCounters () विधि इस ऑपरेशन के लिए इष्टतम अनुरोध उत्पन्न करती है:
 UPDATE `banners` SET `hits`=`hits`+1 WHERE `banners`.`id`=1 

यही इसके प्रदर्शन का रहस्य है।

मुझे उम्मीद है कि यह जानकारी आपके लिए उपयोगी होगी और आपके वेब एप्लिकेशन को थोड़ा तेज़ कर देगी।

Source: https://habr.com/ru/post/In138534/


All Articles