टी एल; डॉ:
वे अपने ढेर के MySQL नीचे से ऊपर सब कुछ के लिए कैश की गई रेखांकन के साथ एक ढेर वास्तुकला का उपयोग करें।
लंबा जवाब:
मैं अपने आप को कैसे वे डेटा के अपने विशाल राशि को संभालने और एक त्वरित तरीके से खोज, क्योंकि मैं उत्सुक था इस पर कुछ शोध किया था। मैंने देखा है लोगों को धीमी गति से होता जा रहा है जब उपयोगकर्ता आधार बढ़ता कस्टम मेड सामाजिक नेटवर्क स्क्रिप्ट के बारे में शिकायत। बाद मैं कुछ अपने आप के साथ बेंचमार्किंग किया सिर्फ 10k उपयोगकर्ताओं और 25 लाख दोस्त भी समूह की अनुमतियों और पसंद और दीवार पदों के बारे में परेशान करने की कोशिश कर नहीं - - कनेक्शन इसे जल्दी पता चला कि इस दृष्टिकोण से दोषपूर्ण है। इसलिए मैं यह कैसे बेहतर करने के लिए पर वेब की खोज कुछ समय बिताया और इस आधिकारिक फेसबुक लेख भर में आया है:
मैं वास्तव में से पहले पढ़ना जारी रखने के ऊपर पहली कड़ी की प्रस्तुति देखने के लिए सलाह देते हैं। यह शायद कैसे अमेरिकन प्लान दृश्यों आप पा सकते हैं पीछे काम करता है की सबसे अच्छा विवरण है।
वीडियो और लेख आपको कुछ बातें बताता है:
- वे बहुत से MySQL का उपयोग कर रहे नीचे उनके ढेर के
- ऊपर एसक्यूएल डीबी वहाँ टीएओ परत जो कैशिंग के कम से कम दो स्तरों और शामिल कनेक्शन का वर्णन करने के रेखांकन का उपयोग कर रहा है।
- मैं क्या सॉफ्टवेयर / डीबी वे वास्तव में अपने कैश किए गए रेखांकन के लिए उपयोग पर कुछ भी नहीं मिला
चलो इस पर एक नज़र डालें, मित्र कनेक्शन ऊपरी बाएँ हैं करते हैं:

खैर, यह एक ग्राफ है। :) यह आपको बता नहीं है कैसे एसक्यूएल में इसे बनाने की है, वहाँ यह करने के लिए कई तरीके हैं, लेकिन इस साइट अलग दृष्टिकोण का एक अच्छा राशि है। ध्यान दें: विचार करें कि एक संबंधपरक DB कि यह क्या है है: यह सामान्यीकृत डेटा, नहीं एक ग्राफ संरचना स्टोर करने के लिए सोचा है। तो यह एक विशेष ग्राफ डेटाबेस के रूप में के रूप में अच्छा प्रदर्शन नहीं करेगा।
भी विचार आप मित्रों के सिर्फ दोस्त की तुलना में अधिक जटिल क्वेरी, उदाहरण के लिए क्या करना है कि जब आप के आसपास सभी स्थानों फ़िल्टर करना चाहते हैं किसी दिए गए समन्वय है कि आप और जैसे दोस्तों के अपने मित्रों को। एक ग्राफ एकदम सही समाधान यहाँ है।
मैं आपको बता नहीं सकता कि यह कैसे निर्माण करने के लिए इतना है कि यह अच्छा प्रदर्शन करेंगे, लेकिन यह स्पष्ट रूप से कुछ परीक्षण और त्रुटि और बेंच मार्किंग की आवश्यकता है।
यहाँ मेरी है निराशाजनक के लिए परीक्षण सिर्फ अच्छे दोस्त के निष्कर्षों मित्र:
डीबी स्कीमा:
CREATE TABLE IF NOT EXISTS `friends` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`friend_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
दोस्तो क्वेरी के मित्र:
(
select friend_id
from friends
where user_id = 1
) union (
select distinct ff.friend_id
from
friends f
join friends ff on ff.user_id = f.friend_id
where f.user_id = 1
)
मैं वास्तव में आप कम से कम 10k उपयोगकर्ता रिकॉर्ड के साथ आप कुछ नमूना डेटा बनाने के लिए सलाह देते हैं और उनमें से प्रत्येक में कम से कम 250 मित्र कनेक्शन होने और उसके बाद इस क्वेरी चलाते हैं। मेरी मशीन (i7 4770k, एसएसडी, 16GB RAM) पर परिणाम था ~ 0.18 सेकंड उस क्वेरी के लिए। शायद यह अनुकूलित किया जा सकता है, मैं कर रहा हूँ नहीं एक डीबी प्रतिभा (सुझाव का स्वागत है)। हालांकि, अगर इस तराजू रैखिक तुम सिर्फ 100k उपयोगकर्ताओं, 1 लाख उपयोगकर्ताओं के लिए 18 सेकंड के लिए 1.8 सेकंड में पहले से ही कर रहे हैं।
यह अभी भी ~ 100k उपयोगकर्ताओं के लिए OKish ध्वनि लेकिन विचार है कि आप बस दोस्तों के लाए जाने के दोस्तों और ऐसा नहीं किया हो सकता है "की तरह किसी भी अधिक जटिल क्वेरी मुझे प्रदर्शित केवल दोस्तों के दोस्त की पोस्ट + अनुमति जांच कर अगर मैं अनुमति हूँ या नहीं की अनुमति दी उनमें से कुछ को देखने के लिए + अगर मैं उनमें से किसी को पसंद आया जाँच करने के लिए एक उप क्वेरी करना "। आप डीबी चेक पर करते हैं अगर आप किसी पोस्ट पहले से ही है या नहीं पसंद है या आप कोड में करना होगा बताना चाहते हैं। भी विचार है कि यह केवल क्वेरी आप नहीं चला है और अपने एक कम या ज्यादा लोकप्रिय साइट पर एक ही समय में सक्रिय उपयोगकर्ता की तुलना में अधिक है।
मैं अपने जवाब सवाल यह है कि फेसबुक बहुत अच्छी तरह से अपने दोस्तों के रिश्ते के लिए बनाया गया उत्तर देता है लगता है, लेकिन मुझे खेद है कि मैं आपको नहीं बता कैसे एक तरह से यह तेजी से काम करेंगे में लागू करने के कर सकते हैं। IMHO - एक सामाजिक नेटवर्क को लागू करने के लिए आसान है, लेकिन यकीन है कि यह अच्छा प्रदर्शन स्पष्ट रूप से नहीं है बना रही है।
मैं OrientDB के साथ प्रयोग ग्राफ-प्रश्नों करने के लिए और अंतर्निहित एसक्यूएल डीबी करने के लिए अपने किनारों मानचित्रण शुरू कर दिया है। अगर मैं कभी यह किया मैं इसके बारे में एक लेख लिखने के लिए होगा।