2010-09-04 6 views
6

गिनती करने के लिए क्वेरी अनुकूलन करने के लिए:MySQL - कैसे बस का सबसे अच्छा तरीका निम्नलिखित परिणाम प्राप्त करने के लिए पर कुछ राय के बाद वोट

मैं (प्रत्येक वोट मेरी MySQL डेटाबेस उत्पादों जो उपयोगकर्ताओं द्वारा मतदान किया जा सकता है में संग्रहीत करना चाहते हैं +1 लायक है)। मैं यह भी देखने में सक्षम होना चाहता हूं कि कुल उपयोगकर्ता ने कितनी बार मतदान किया है।

मेरी सरल मन के लिए

, निम्न तालिका संरचना आदर्श होगा:

table: product   table: user   table: user_product_vote  
+----+-------------+ +----+-------------+ +----+------------+---------+ 
| id | product | | id | username | | id | product_id | user_id | 
+----+-------------+ +----+-------------+ +----+------------+---------+ 
| 1 | bananas  | | 1 | matthew  | | 1 | 1   | 2  | 
| 2 | apples  | | 2 | mark  | | 2 | 2   | 2  | 
| .. | ..   | | .. | ..   | | .. | ..   | ..  | 

इस तरह से मैं प्रत्येक उत्पाद या उपयोगकर्ता के लिए user_product_vote तालिका की गिनती कर सकते हैं।

उदाहरण के लिए, जब मैं केले और वोटों की संख्या को देखने के लिए एक वेब पेज मैं निम्न क्वेरी प्रदर्शन कर सकता है पर दिखाना चाहते हैं: (

SELECT p.product AS product, COUNT(v.id) as votes 
FROM product p 
LEFT JOIN user_product_vote v ON p.id = v.product_id 
WHERE p.id =1 

तो मेरी साइट बेहद सफल हो गया है कि हम सब सपना कर सकते हैं) और मेरे पास हजारों उपयोगकर्ता हजारों उत्पादों पर मतदान कर रहे थे, मुझे डर है कि प्रत्येक पृष्ठ दृश्य के साथ ऐसा COUNT प्रदर्शन सर्वर संसाधनों के मामले में अत्यधिक अक्षम होगा।

एक और आसान तरीका उत्पाद तालिका में 'वोट' कॉलम होना होगा जो प्रत्येक बार वोट जोड़े जाने पर बढ़ाया जाता है।

table: product    
+----+-------------+-------+ 
| id | product | votes | 
+----+-------------+-------+ 
| 1 | bananas  | 2  | 
| 2 | apples  | 5  | 
| .. | ..   | .. | 

हालांकि यह अधिक संसाधन अनुकूल है - मैं डेटा (। उदाहरण के लिए मैं अब एक व्यक्ति दो बार मतदान से वहाँ के रूप में उनके मतदान गतिविधि का कोई रिकॉर्ड नहीं है रोका जा सकता है) खो देते हैं।

मेरे प्रश्न हैं:
i) क्या मैं सर्वर संसाधनों के बारे में अत्यधिक चिंतित हूं और केवल तीन तालिका विकल्प के साथ रहना चाहिए? (यानी मुझे बड़े प्रश्नों को संभालने के लिए डेटाबेस की क्षमता में अधिक विश्वास करने की आवश्यकता है)
ii) जानकारी खोने के बिना परिणाम प्राप्त करने का उनका एक अधिक प्रभावी तरीका है

+1

आपकी समस्या यह है कि आपके पास शायद ऐसी वेबसाइट नहीं है जो बड़े पैमाने पर यातायात प्राप्त करती है, इसलिए PHP/mysql क्षमताओं की आपकी अनिश्चितता, मैं आपको आश्वस्त करता हूं कि MySQL एक हजारों प्रश्नों को एक दूसरे से अधिक प्रदर्शन करने के साथ संभाल सकता है – RobertPitt

उत्तर

6

आप संसाधनों के बारे में चिंतित नहीं हो सकते हैं, जब आप पहली बार एप्लिकेशन बनाने शुरू करते हैं, तो आपके पास हमेशा संसाधन, स्थान, गति इत्यादि होना चाहिए, अगर आपकी साइट का यातायात नाटकीय रूप से बढ़ता है और आपने संसाधनों के लिए कभी भी निर्माण नहीं किया है तो आप समस्याओं में

वोट प्रणाली के लिए के रूप में, व्यक्तिगत रूप से मैं वोटों की तरह रखना होगा:

table: product   table: user    table: user_product_vote  
+----+-------------+ +----+-------------+ +----+------------+---------+ 
| id | product | | id | username | | id | product_id | user_id | 
+----+-------------+ +----+-------------+ +----+------------+---------+ 
| 1 | bananas  | | 1 | matthew  | | 1 | 1   | 2  | 
| 2 | apples  | | 2 | mark  | | 2 | 2   | 2  | 
| .. | ..   | | .. | ..   | | .. | ..   | ..  | 

कारण:

सबसे पहले user_product_vote पाठ, धब्बे आदि शामिल नहीं है, यह पूरी तरह पूर्णांक तो यह ऊपर ले जाता है वैसे भी कम संसाधन।

table: user_product_vote  
+----+------------+---------+-----------+------+ 
| id | product_id | user_id | vote_type | time | 
+----+------------+---------+-----------+------+ 
| 1 | 1   | 2  | product |224.. | 
| 2 | 2   | 2  | page  |218.. | 
| .. | ..   | ..  | ..  | .. | 
:

दूसरे, आप इस तरह के कुल वोट पिछले 24 घंटे, पिछले 24 घंटे आदि

से अधिक उच्चतम रेट किया गया उत्पाद उदाहरण के लिए इस उदाहरण लें के रूप में अपने आवेदन के भीतर नई संस्थाओं के लिए एक द्वार की अधिक है

और एक सरल प्रश्न:

SELECT COUNT(id) as total FROM user_product_vote WHERE vote_type = 'product' AND time BETWEEN(....) ORDER BY time DESC LIMIT 20 

एक और बात एक उपयोगकर्ता 1AM में मतदान और फिरपर फिर से वोट करने की कोशिश की है, तो है, आप आसानी से जांच सकते हैं कि आखिरी बार उन्होंने मतदान कब किया था और यदि उन्हें दोबारा मतदान करने की अनुमति दी जानी चाहिए।

यदि आप अपने वृद्धिशील उदाहरण के साथ चिपके रहते हैं तो आप बहुत सारे अवसर खो देंगे।


संबंध में अपने count(), कोई फर्क नहीं पड़ता कि आप कितना आपके प्रश्नों का अनुकूलन करने के यह वास्तव में एक बड़े पैमाने पर एक फर्क नहीं होता।

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

0

आपको अपनी इच्छा को संतुलित करना होगा साइट को जल्दी से करने के लिए (जिसमें दूसरी स्कीमा सबसे अच्छी होगी) और विशिष्ट उपयोगकर्ताओं के लिए वोट गिनने और डबल वोटिंग को रोकने की क्षमता (जिसके लिए मैं पहली स्कीमा चुनूंगा)। चूंकि आप केवल user_product_vote तालिका के लिए पूर्णांक कॉलम का उपयोग कर रहे हैं, इसलिए मुझे नहीं लगता कि प्रदर्शन कितना पीड़ित हो सकता है। कई से अधिक संबंध आम हैं, क्योंकि आपने user_product_vote के साथ कार्यान्वित किया है। यदि आप विशिष्ट उपयोगकर्ताओं के लिए वोट गिनना चाहते हैं और डबल वोटिंग को रोकना चाहते हैं, तो user_product_vote एकमात्र clean तरीका है जिसे मैं इसे लागू करने के बारे में सोच सकता हूं, क्योंकि किसी अन्य के परिणामस्वरूप स्पैस रिकॉर्ड, डुप्लिकेट रिकॉर्ड और सभी प्रकार की बुरी चीजें हो सकती हैं।

1

क्यों मिश्रण और दोनों मेल नहीं खाते? उत्पाद और उपयोगकर्ता तालिकाओं में केवल अंतिम गणनाएं हैं, ताकि आपको हर बार गिनने की आवश्यकता न हो और वोट तालिका न हो, ताकि कोई डबल पोस्टिंग न हो।

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

संपादित करें: मैं यह भी मान रहा हूं कि आपने product_id और user_id पर एक अद्वितीय अनुक्रमणिका बनाई है, इस मामले में कोई भी डुप्लिकेशंस प्रयास स्वचालित रूप से विफल हो जाएगा और आपको डालने से पहले तालिका में जांचना नहीं होगा। आप यह सुनिश्चित करने के लिए करेंगे कि सम्मिलित क्वेरी चल रही है और आपको insert_id

0

पर फ़ॉर्म में "आईडी" के लिए मान्य मान प्राप्त हुआ है, आप हर बार जब कोई वोट वोट करते हैं तो आप सीधे उत्पाद तालिका को अपडेट नहीं करना चाहते हैं - यह उत्पाद पंक्तियों को लॉक कर देगा जो तब उत्पादों का उपयोग कर रहे अन्य प्रश्नों को प्रभावित करेगा।

मान लीजिए कि सभी उत्पाद प्रश्नों को वोट कॉलम शामिल करने की आवश्यकता नहीं है, तो आप एक अलग उत्पादवॉट तालिका रख सकते हैं जो चलने वाले योग को बनाए रखेगा, और अपने उपयोगकर्ता प्रोडक्टवोट तालिका को प्रति उपयोगकर्ता व्यवसाय नियमों/लेखा परीक्षा।

2

तो मेरी साइट बेहद सफल हो गया (हम सभी सपने कर सकते हैं) और मैं उन उत्पादों के हजारों पर मतदान के हजारों, मुझे डर था कि हर पृष्ठ को देखने के साथ इस तरह के एक COUNT प्रदर्शन सर्वर संसाधनों के मामले में अत्यधिक अक्षम होगा ।

काल्पनिक समस्याओं को हल करने में अपना समय बर्बाद न करें। MySQL एक दूसरे के अंशों में हजारों रिकॉर्ड संसाधित करने में पूरी तरह से सक्षम है - यह डेटाबेस के लिए है। स्वच्छ और सरल डेटाबेस और कोड संरचना पौराणिक "अनुकूलन" से कहीं अधिक महत्वपूर्ण है जिसे किसी को भी आवश्यकता नहीं है।

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