2011-03-09 15 views
18

यह प्रश्न इंडेक्स प्रबंधित करने और बीसन दस्तावेज़ों को जोड़ने के लिए आंतरिक विधि से संबंधित है।MongoDB: इंडेक्स ऑर्डर और क्वेरी ऑर्डर से मेल खाना चाहिए?

जब आप "इंडेक्स 1", "इंडेक्स 2", "इंडेक्स 3" जैसे एकाधिक इंडेक्स बनाते हैं ... इंडेक्स को क्वेरी के दौरान इस्तेमाल किया जाता है, लेकिन क्वेरी के क्रम और प्रदर्शन के परिणाम के बारे में क्या होता है।

नमूना
index1, index2, index3 ----> उसी क्रम index1 में क्वेरी, index2, index3 (सबसे अच्छा मामले) index1, index2, index3 ----> एक अन्य आदेश index2 में क्वेरी, index1, इंडेक्स 3 (ऑर्डर बदल गया)

कई बार आप इन 3 इंडेक्स और अन्य वस्तुओं या अधिक इंडेक्स सहित नेस्टेड प्रश्नों का उपयोग करते हैं। प्रश्नों का क्रम कुछ समय खो जाएगा? परिभाषित इंडेक्स ऑर्डर का सम्मान करने वाले प्रश्नों को पारित करना होगा या आंतरिक आर्किटेक्चर इस ऑर्डर खोज के बारे में परवाह करेगा? मैं जानना चाहता हूं कि क्या मैं इस पर ख्याल रखता हूं या स्वतंत्रता में अपने प्रश्न बना सकता हूं।

धन्यवाद।

+0

मैं 'mongodb-csharp' टैग को हटा दूंगा: यह बैकएंड पर अनुक्रमणिका के बारे में एक प्रश्न है। –

उत्तर

32

आपकी क्वेरी में स्थितियों का क्रम इस बात पर प्रभाव नहीं डालता है कि यह किसी सूचकांक या नहीं का उपयोग कर सकता है या नहीं।

उदा। ठेठ दस्तावेज़ संरचना:

{ 
    "FieldA" : "A", 
    "FieldB" : "B" 
} 

आप एक पर एक यौगिक सूचकांक और बी है, तो:

db.MyCollection.find({FieldA : "A", FieldB : "B"}) 
db.MyCollection.find({FieldB : "B", FieldA : "A"}) 
:

db.MyCollection.ensureIndex({FieldA : 1, FieldB : 1}) 

तो निम्नलिखित प्रश्नों के दोनों कि सूचकांक का उपयोग करने में सक्षम हो जाएगा

इसलिए क्वेरी में स्थितियों का क्रम इंडेक्स का उपयोग नहीं किया जाता है - जो मुझे लगता है कि वह प्रश्न है जो आप पूछ रहे हैं।

आप खोल में 2 प्रश्नों को आजमाकर और .explain() को ढूंढकर आसानी से इसका परीक्षण कर सकते हैं। मैंने अभी पुष्टि करने के लिए यह किया है, और दोनों ने दिखाया कि यौगिक सूचकांक का उपयोग किया गया था।

लेकिन, अगर आप निम्न क्वेरी चलाने के लिए, इस सूचकांक का उपयोग नहीं होगा के रूप में FieldA पर क्वेरी नहीं किया जा रहा है:

db.MyCollection.find({FieldB : "B"}) 

तो यह सूचकांक कि परिभाषित करता है यह हो सकता है कि क्या में खेतों के आदेश है एक प्रश्न द्वारा प्रयोग किया जाता है और क्वेरी में फ़ील्ड का ऑर्डर नहीं करता (यह लुकास का जिक्र था)।

+2

यहां ध्यान देने योग्य महत्वपूर्ण बात यह है कि क्वेरी में क्रम कोई फर्क नहीं पड़ता है, लेकिन सूचकांक में परिभाषित फ़ील्ड का क्रम करता है। –

+1

लेकिन इंडेक्स को परिभाषित करते समय आप ऑर्डर कैसे निर्दिष्ट करते हैं? सुनिश्चित करें कि इंडेक्स एक जेएस ऑब्जेक्ट को एक पैरा के रूप में लेता है, और फ़ील्ड जेएस ऑब्जेक्ट्स का ऑर्डर नहीं किया जाता है। (हाय स्कॉट!) – Leopd

+4

@Leopd: उन्हें प्रति spec आदेश नहीं दिया जाता है, लेकिन वे कार्यान्वयन में आदेश दिया जाता है, और MongoDB इस व्यवहार पर निर्भर करता है। यह मोंगोडीबी में अधिक अप्रिय डिज़ाइन वारों में से एक है, और अधिकांश अन्य भाषाओं में कूदने की ओर जाता है (क्योंकि अधिकांश शब्दकोश प्रकार * ऑर्डर नहीं किए जाते हैं)। –

9

http://www.mongodb.org/display/DOCS/Indexes से:

आप कई क्षेत्रों पर एक यौगिक सूचकांक है, तो आप यह प्रश्न के क्षेत्रों में शुरुआत सबसेट पर उपयोग कर सकते हैं। तो अगर आप

ए, बी पर एक सूचकांक, ग

है आप इसे

एक

एक पर क्वेरी,

ए, बी बी, सी

उपयोग कर सकते हैं

तो हाँ, आदेश मायने रखता है। यदि आपको अधिक सटीक उत्तर की आवश्यकता है तो आपको अपने प्रश्न को थोड़ा सा स्पष्ट करना चाहिए।

+0

बी, ए या बी, सी, ए या सी, बी, ए के बारे में क्या। आप पूछ सकते हैं कि आप पूछ सकते हैं, लेकिन यह पता है, मैं पूछताछ के आदेश के बारे में विशेष रूप से मांग करता हूं जो सूचकांक को प्रस्तुत किया जाएगा। var quer = Query.AND (Query.EQ ("B", b), Query.EQ ("ए", ए)), क्वेरी = क्वेरी। या (क्वेरी, क्वेरी.ईक्यू ("सी", सी))। आंतरिक ए, बी, सी को कम करेगा या बी, ए, सी खो जाएगा। – user325558

+0

इस टिप्पणी से, और एक इंडेक्स (ए, बी, सी) मानते हुए, मुझे लगता है कि आप पूछ रहे हैं कि क्वेरी ऑप्टिमाइज़र (बी, सी, ए) से (ए, बी, सी) पर एक उदाहरण क्वेरी पुनर्व्यवस्थित करने में सक्षम होगा या नहीं सूचकांक का उपयोग करने के लिए। जवाब हां है, और इसे 'व्याख्या' (जैसे @AdaTheDev ने इंगित किया) का उपयोग करके आसानी से पुष्टि की जा सकती है। नोट: कम से कम यह 1.8.0rc1 पर सच है - पिछले संस्करणों पर परीक्षण नहीं किया है। –

+0

तो इसका मतलब यह है कि अगर मैं केवल बी और सी पर पूछताछ कर रहा हूं, तो सूचकांक का उपयोग नहीं किया जाएगा? – MonkeyBonkey

0

हां, माईएसक्यूएल इंडेक्स की तरह। मोंगोडीबी इंडेक्स का कार्यान्वयन MySQL के समान है। विवरण आप http://en.wikipedia.org/wiki/B-tree देख सकते हैं।

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