आपके पास ऐसी कोई अनुक्रमणिका नहीं है जिसे mongo स्वचालित रूप से उसके लिए उपयोग करेगा, इसलिए यह एक पूर्ण तालिका स्कैन कर रहा है।
जैसा कि दस्तावेज़ में बताया गया है
क्यों
यदि आपके पास a,b पर एक अनुक्रमणिका है - और आप a
. द्वारा खोजते हैं अकेला - एक सूचकांक स्वचालित रूप से उपयोग किया जाएगा। ऐसा इसलिए है क्योंकि यह इंडेक्स की शुरुआत है (जो करने में तेज़ है), डीबी बाकी इंडेक्स वैल्यू को अनदेखा कर सकता है।
a,b पर एक अनुक्रमणिका अक्षम है b
. द्वारा खोजते समय केवल इसलिए कि यह "इसफिक्स्डस्ट्रिंग के साथ शुरू होता है" के साथ खोज करने वाले सूचकांक का उपयोग करने की संभावना नहीं देता है।
तो, या तो:
- क्वेरी में _reference_1_id शामिल करें (शायद अप्रासंगिक)
- या _reference_2_id पर एक अनुक्रमणिका जोड़ें (यदि आप अक्सर फ़ील्ड द्वारा क्वेरी करते हैं)
- या संकेत का उपयोग करें
संकेत
संभवत:अभी आपका सबसे कम लागत वाला विकल्प है।
अपने _reference_1_id_1__reference_2_id_1_id_1
का उपयोग करके बलपूर्वक क्वेरी संकेत जोड़ें अनुक्रमणिका। जो एक पूर्ण तालिका स्कैन की तुलना में बहुत तेज़ होने की संभावना है, लेकिन फिर भी उस अनुक्रमणिका की तुलना में बहुत धीमी है जो उस फ़ील्ड से शुरू होती है जिसे आप क्वेरी में उपयोग कर रहे हैं।
यानी
db.mycoll
.find({"_reference_2_id" : ObjectId("jkl7890123456")})
.hint("_reference_1_id_1__reference_2_id_1_id_1");