2012-05-03 5 views
7

मेरे पास उपयोगकर्ता 'वोट' तालिका और 'उपयोगकर्ता' तालिका वाला डेटाबेस है। मुझे लगता है कि डेटाबेस थोड़े समय में काफी बड़ा हो जाएगा, इसलिए मैं सबसे कुशल विधि का उपयोग करना चाहता हूं।COUNT() प्रत्येक बार कार्य करता है, या मूल्य को संग्रहीत करता है और इसे एक से बढ़ाता है?

मुझे लगता है कि मैं या तो COUNT() प्रत्येक बार 'वोट' तालिका से WHERE कथन के साथ वोटों की राशि कर सकता हूं, या मैं 'उपयोगकर्ता' तालिका में स्कोर को स्टोर कर सकता हूं और इसे केवल 1 तक बढ़ा सकता हूं एक समय जोड़ा गया है।

कौन होगा सबसे अच्छा/सबसे तेज, और/या वहाँ ऐसा करने का किसी भी अन्य तरीके हैं?

उत्तर

2

यदि आप इसे करने का सबसे अच्छा तरीका सोच रहे हैं। आपको बहुत अनुकूलन और कैशिंग करना है।

मैं कहूंगा, उपयोगकर्ता टेबल कैश्ड स्कोर स्टोर करने के लिए पर एक स्तंभ बनाएँ, लेकिन अलग मेज पर स्कोर बनाए रखें।

जब भी स्कोर परिवर्तन स्कोर तालिका के काम करते हैं और नवीनतम स्कोर परिणाम के साथ उपयोगकर्ता के मेज पर अपडेट ट्रिगर।

ऐसा करने से, आप करने के लिए अपने स्कोर को डेटा में extendability है क्या stackoverflow वोट के लिए उपयोग करता है एक तरह से पसंद है।

+0

"कैश किए गए स्कोर को स्टोर करने के लिए उपयोगकर्ता टेबल पर एक कॉलम _Create करें" क्या आपका मतलब है कि डीबी इंजन इसे स्टोर करेगा, प्रोग्रामर नहीं? –

+0

@ श्री टामर, मुझे खेद है, लेकिन मैं आपको 'प्रोग्रामर नहीं' शब्द से निहितार्थ नहीं समझता – Starx

2

उचित विन्यास में (डिफ़ॉल्ट कॉन्फ़िगरेशन ज्यादातर मामलों में काफी अच्छा है) MySQL 5.0 + सर्वर योग कैश कर रहा है, प्रश्नों की संख्या, इसलिए MySQL स्वचालित रूप से प्रश्नों के उस तरह से निपटने है।

लेकिन यदि आप पुराने संस्करण (MySQL 4 या उससे कम) का उपयोग कर रहे हैं, तो मैं डेटाबेस में COUNT (*) मानों को स्टोर करने की अनुशंसा करता हूं, क्योंकि यह वास्तव में बड़ी तालिकाओं पर perfomance पर कारण बनता है।

संपादित करें: सर्वश्रेष्ठ अभ्यास मैं खोज की एक COUNT (*) क्वेरी हर बार उपयोगकर्ता जोड़ रहा है कर रहा है/वोट हटाने/टिप्पणी आदि आधुनिक एसक्यूएल सर्वर समूह प्रश्नों संभाल रहे हैं बहुत अच्छी तरह से है, तो हमारे पास नहीं है परेशान करने के लिए परफॉर्मेंस के बारे में।

+0

क्या COUNT में बहुत अधिक परिवर्तन होने पर गलत परिणामों का कोई खतरा है? –

+0

आईएमओ सर्वश्रेष्ठ अभ्यास एक COUNT (*) क्वेरी बनाता है जब भी उपयोगकर्ता वोट/टिप्पणी इत्यादि जोड़/हटा रहा है। वैसे भी आधुनिक एसक्यूएल सर्वर समूह प्रश्नों को बहुत अच्छी तरह से संभालने में कामयाब रहे हैं। – Peter

+0

"MySQL 5।0+ सर्वर एसयूएम, COUNT प्रश्नों को कैश कर रहा है, इसलिए MySQL स्वचालित रूप से उस तरह के प्रश्नों को संभालने में कामयाब रहा है। "--- आपकी धारणा किस पर आधारित है? कैश करने या नहीं - ** ** पर निर्भर करता है ** मानदंड – zerkms

0

प्रीकुल्यूलेशन अक्सर असामान्य अनुकूलन में से एक है।

तो बस precalculated स्तंभ बनाने और ट्रिगर या अपने आवेदन कोड के साथ बनाए रखें।

जैसा कि @ बोहेमियन ने बताया: आपको केवल करने की आवश्यकता है यदि आपके पास प्रदर्शन समस्याएं हैं।

+0

+! यह वही है जो मैं करता हूं, लेकिन केवल तभी प्रदर्शन एक समस्या बन गया। आखिरी अनुकूलित करें - इसे पहले काम करें। – Bohemian

+0

@ बोहेमियन: मैंने पृष्ठभूमि में यही माना है :-) – zerkms

0

यह लागत और जटिलता में एक व्यापार-बंद है। उपयोगकर्ता तालिका में गिनती बनाए रखने से, यह सटीक रखने के लिए कुछ जटिलता जोड़ता है, और यह वोट डालने/हटाने के लिए लागत जोड़ता है। इसका मतलब है कि एक वोट जोड़ना आवश्यक है (कम से कम) दो टेबल अपडेट करना।

तो यह थोड़ा सा निर्भर करता है कि किस टुकड़े को सबसे कुशल होना चाहिए। यदि वोट गिनती को पुनः प्राप्त करना बहुत अधिक बार किया जाता है, तो शायद यह गिनती को बनाए रखने के लिए समझ में आता है।

मेरी राय में, हालांकि, यह बेहतर होगा पहले सरल कार्यान्वयन के साथ जाने के लिए और लगता है कि डेटाबेस क्वेरी अनुकूलन और यह एक गैर मुद्दा बनाने के लिए सक्षम हो जाएगा करने के लिए। यदि यह पर्याप्त तेज़ी से नहीं निकलता है, तो बाद में पूर्व-गणना गणना को जोड़ने के लिए परिवर्तन करें।

संबंधित मुद्दे