यदि आपकी शर्तें पदानुक्रमित हैं (जैसे आपके उदाहरण में) आप संयुक्त सूचकांक का उपयोग कर सकते हैं। डीबीएमएस को एक साथ कई इंडेक्स के साथ काम करने में परेशानी है। हालांकि यह संभव है और वे इस तरह की स्थिति से बाहर निकलने का प्रयास करते हैं।
यह इस तथ्य को नहीं बदलेगा कि आपको किसी निश्चित समूह के लिए एक विशिष्ट अनुक्रमणिका रखने का प्रयास करना चाहिए। यदि अधिक WHEREs 'इंडेक्स को एक से जोड़ा जा सकता है, तो आप कुछ जगह और सीपीयू चक्र मुक्त कर सकते हैं।
की हर जगह के लिए एक सूचकांक निर्दिष्ट करके बाहर शुरू करते हैं:
index1 (race_type, recordable_type, active)
index2 (race_type, recordable_id, recordable_type, active)
index3 (user_id, race_type, recordable_id, recordable_type, active)
सामान्य तौर पर आप प्रमुखता आरोही करके अपने आदेश अनुकूलन कर सकते हैं। कार्डिनालिटी संभावित मानों की संख्या है कि आपके डेटासेट में कॉलम में होगा। आपके उदाहरण में active
एक बूलियन है। (कृपया ध्यान दें कि boolean
में केवल दो मान हो सकते हैं वास्तव में महत्वपूर्ण नहीं है। यह int
हो सकता है यदि आपको पता है कि इसमें केवल दो मान होंगे: 0 और 1)।
आपके active
फ़ील्ड की निम्न कार्डिनालिटी का अर्थ है कि एक ही लुकअप के साथ हम संभावित रिकॉर्ड्स के आधे को समाप्त कर सकते हैं (कोर्स के अपने डेटासेट के आधार पर)। इस कदम के बाद अपने पहले सूचकांक देखने की तरह होगा:
index1 (active, race_type, recordable_type)
प्रमुखता इसके अलावा आप क्षेत्रों के बीच किसी भी तार्किक पदानुक्रम के लिए ध्यान देना चाहिए। इन नामों का अर्थ जानने के बिना मैं अंगूठे के नियम के रूप में अनुमान लगाता हूं कि कुछ दौड़ प्रकार का अपना रिकॉर्डबेल होगा। - यह एक से अधिक रेस प्रकार के पाठ्यक्रम के साथ उपयोग किए जाने वाले रिकॉर्ड करने योग्य होने की संभावना को खत्म नहीं करेगा, लेकिन आपको एक ऑर्डर चुनना होगा और यह अधिक तार्किक लगता है। - इसलिए हम race_type
, recordable_type
ऑर्डर का उपयोग करेंगे।
अब चलिए दूसरी अनुक्रमणिका में ले लें। आपने यहां recordable_id
पेश किया है। अपने डेटासेट को जानने के बिना मैं सुरक्षित रूप से मान सकता हूं कि recordable_id की कार्डिनालिटी रिकॉर्ड करने योग्य_टाइप की तुलना में बड़ी होगी। दूसरे शब्दों में प्रकारों की तुलना में अधिक आईडी होगी। इसके अलावा मुझे टाइप और आईडी (एक से कई लोगों की तरह गंध) के बीच पदानुक्रम पर संदेह है। तो चलिए इसे इस प्रकार टाइप करें:
index2 (active, race_type, recordable_type, recordable_id)
अब यह एक अन्य महत्वपूर्ण कोण पर ध्यान देने का समय है। आपके डीबी को संशोधित करते समय इंडेक्स की अपनी एचडीडी (अनिवार्य रूप से मुक्त) और सीपीयू चक्र पर अपनी लागत होती है। किसी भी इंडेक्स का सबसेट बाएं से दाएं से शुरू किया जा सकता है। index2
अनिवार्य रूप से index1
है क्योंकि यह index1 + recordable_id
है, इसलिए आप इसे से छुटकारा पा सकते हैं और एक के साथ समाप्त हो सकते हैं।
user_id
के साथ आता है।एक आईडी फ़ील्ड के रूप में यह उच्च कार्डिनालिटी (कई संभावित मान) सुझाता है, लेकिन ध्यान दें कि यह नियम नहीं है कि "बाद में दायर की गई कार्डिनिटी उच्च होगी"। हमने खेतों के बीच पदानुक्रम जैसे संबंधों की मदद करने के लिए एक बीकन के रूप में कार्डिनिटी का उपयोग किया। (और सूचकांक आकार घटाना)।
क्या user_id
व्यक्तिगत प्रतिभागी को इंगित करता है जिस डेटा पर हम देख रहे हैं (कई संभावनाएं)? या यह वह ग्राहक है जिसने डेटा अपलोड किया (बहुत कम संभावनाएं)? यह कहना मुश्किल है। तुम बस अपने मौजूदा index2
से संलग्न कर सकते हैं और आप एक ही सूचकांक कि तीनों secnarios में इस्तेमाल किया जा सकता है के साथ खत्म हो जाएगा:
search_index (active, race_type, recordable_type, recordable_id, user_id)
... या यह इस scanario के लिए एक दूसरे सूचकांक होने के लायक हो सकता है ..
आपका प्रश्न विशेष है क्योंकि आप अपने क्लॉज में केवल =
का उपयोग करते हैं। AND (race_type = 1 OR race_type=8)
जैसे >
या <
का उल्लेख नहीं करने के लिए कई अन्य विचार हैं। इसके अलावा यदि आप ORDER BY
का उपयोग करते हैं जिसे आपके द्वारा उपयोग किए जाने वाले इंडेक्स में शामिल किया जा सकता है।
कृपया वर्तमान तालिका परिभाषा दिखाएं (तालिका बनाएं ...)। क्या user_id प्राथमिक कुंजी का हिस्सा है? – Devart