2011-08-10 12 views
6

कहें कि मेरे पास निम्न डिज़ाइन है:MongoDB - सादे कुंजी में खोज के रूप में तेजी से सरणी में खोज रहा है?

id | participant_ids 
...| [ObjectId(...), ObjectId(...)] 

अब मैं इसे इस तरह से पूछ रहा हूं:

db.events.find({ 
    participant_ids: ObjectId(...) 
}); 

जो इसके समान है:

db.events.find({ 
    participant_ids: { 
     $in: ObjectId(...) 
    } 
}); 

मुझे लगता है कि वहां ' उन दोनों के बीच प्रदर्शन में अंतर नहीं है (लेकिन अगर मैं गलत हूं तो मुझे सही करें!)।


प्रत्येक घटना के लिए, कम से कम 1 और अधिकतम 2 प्रतिभागियों में हैं। तो मैं निम्नलिखित डिज़ाइन का भी उपयोग कर सकता हूं:

id | participant_1_id | participant_2_id 

... और इसे इस तरह से पूछें ...:

db.events.find({ 
    $or: { 
     participant_1_id: ObjectId(...), 
     participant_2_id: ObjectId(...) 
    } 
}); 

अगर मैं अनुक्रमण का उपयोग नहीं करता, तो शायद यह ' टी वास्तव में एक फर्क नहीं पड़ता, लेकिन - निश्चित रूप से- मैं हूं।

पहले डिज़ाइन के लिए, मैं निम्न इंडेक्स के साथ जाऊंगा:

db.events.ensureIndex({ 
    participant_ids: 1 
}); 

दूसरे के लिए, मैं इसके साथ जाऊंगा:

db.events.ensureIndex({ 
    participant_1_id: 1, 
    participant_2_id: 1 
}); 

दोनों डाउनसाइड्स जब आप उनके प्रदर्शन को देखते हैं।

  • पहली क्वेरी:Array का उपयोग करना शायद सादे कुंजी का उपयोग करने से धीमा है।
  • दूसरी क्वेरी:$or -operator का उपयोग करना बहुत तेज़ नहीं है।
  • दूसरी क्वेरी: बहुत स्केलेबल नहीं है, कहें कि मैं कभी-कभी प्रतिभागियों की सीमा को छोड़ना चाहता हूं, यह संभव नहीं होगा (आपके पास $or -part के असीमित कुंजी और असीमित आइटम होंगे क्वेरी)।

मेरे प्रश्न हैं: - मुझे किस डिजाइन का उपयोग करना चाहिए? - क्या मैं Array एस इंडेक्स कर सकता हूं? दस्तावेज़ इस बारे में कुछ भी नहीं कहते हैं, और मुझे यकीन नहीं है कि Array s हैं (क्योंकि उनकी सामग्री वास्तव में बहुत भिन्न हो सकती है)।

उत्तर

5

पहली क्वेरी: एक ऐरे का उपयोग करना शायद सादे कुंजी का उपयोग करने से धीमा है।

मुझे ऐसा नहीं लगता है। यदि आपके पास एक मान ("सादा कुंजी") या एकाधिक ("ऐरे") है तो यह सटीक वही अनुक्रमणिका-आधारित पहुंच पथ होना चाहिए।

participant_1_id, participant_2_id बस भयानक है।

+0

बहुत बहुत धन्यवाद! मुझे डर था कि यह धीमा होगा (जो एक कारण हो सकता है कि अन्य rdbs 'ऐरे' का उपयोग नहीं कर रहे हैं। यह सुनने के लिए बहुत बढ़िया है कि अलग-अलग चाबियाँ (बस रास्ता पठनीय)। – elslooo

+1

पुष्टि की। कोई प्रदर्शन अंतर नहीं है और सरणी संस्करण काफी अधिक लचीला है। –

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