आप गलत समझते हैं कि अनुक्रमणिका कैसे काम करती है।
एक टेलीफोन बुक के बारे में सोचें (पहले अंतिम नाम पर दो-स्तंभ अनुक्रमणिका के बराबर, पहला नाम अंतिम)। अगर मैं आपको टेलीफोन बुक में उन सभी लोगों को खोजने के लिए कहूं जिनका अंतिम नाम "स्मिथ" है, तो आप इस तथ्य से लाभ उठा सकते हैं कि नाम इस तरह से क्रमबद्ध हैं; आप मान सकते हैं कि स्मिथ एक साथ संगठित हैं। लेकिन अगर मैं आपसे उन सभी लोगों को खोजने के लिए कहूं जिनका पहला नाम "जॉन" है, तो आपको सूचकांक से कोई लाभ नहीं मिलता है। जॉन्स का कोई भी उपनाम हो सकता है, और इसलिए वे पूरी किताब में बिखरे हुए हैं और अंत में आपको कवर से लेकर कवर तक कड़ी मेहनत करनी पड़ती है।
अब अगर मैं आपसे उन सभी लोगों को खोजने के लिए कहूं जिनका अंतिम नाम "स्मिथ" है या जिनका पहला नाम "जॉन" है, तो आप स्मिथ को पहले की तरह आसानी से पा सकते हैं, लेकिन इससे आपको जॉन्स को खोजने में बिल्कुल भी मदद नहीं मिलती है। वे अभी भी पूरी किताब में बिखरे हुए हैं और आपको उन्हें कठिन तरीके से खोजना होगा।
SQL में मल्टी-कॉलम इंडेक्स के साथ भी ऐसा ही है। इंडेक्स को पहले कॉलम द्वारा सॉर्ट किया जाता है, फिर पहले कॉलम में संबंधों के मामलों में दूसरे कॉलम द्वारा सॉर्ट किया जाता है, फिर पहले दो कॉलम आदि दोनों में संबंधों के मामलों में तीसरे कॉलम द्वारा सॉर्ट किया जाता है। यह सभी कॉलम द्वारा सॉर्ट नहीं किया जाता है इसके साथ ही। इसलिए आपकी बहु-स्तंभ अनुक्रमणिका अनुक्रमणिका में सबसे बाएं स्तंभ को छोड़कर आपके खोज शब्दों को अधिक कुशल बनाने में सहायता नहीं करती है।
अपने मूल प्रश्न पर वापस जाएं।
प्रत्येक कॉलम पर एक अलग, सिंगल-कॉलम इंडेक्स बनाएं। MySQL के कितने I/O संचालनों का अनुमान यदि इसका उपयोग किया जाता है तो सूचकांक लागू होगा।
MySQL के आधुनिक संस्करणों में इंडेक्स मर्जिंग के बारे में कुछ स्मार्ट भी हैं। , इसलिए क्वेरी हो सकती है किसी दी गई तालिका में एक से अधिक अनुक्रमणिका का उपयोग करें, और फिर परिणामों को मर्ज करने का प्रयास करें। अन्यथा MySQL किसी दिए गए प्रश्न में प्रति तालिका एक अनुक्रमणिका का उपयोग करने के लिए सीमित हो जाता है।
एक और तरकीब जिसका बहुत से लोग सफलतापूर्वक उपयोग करते हैं, वह है आपके प्रत्येक अनुक्रमित कॉलम के लिए एक अलग क्वेरी करना (जो संबंधित इंडेक्स का उपयोग करना चाहिए) और फिर UNION
परिणाम।
SELECT fields FROM table WHERE field1='something'
UNION
SELECT fields FROM table WHERE field2='something'
UNION
SELECT fields FROM table WHERE field3='something'
UNION
SELECT fields FROM table WHERE field4='something'
एक अंतिम अवलोकन:यदि आप स्वयं को वही 'something'
. खोजते हुए पाते हैं चार क्षेत्रों में, आपको पुनर्विचार करना चाहिए कि क्या सभी चार फ़ील्ड वास्तव में एक ही चीज़ हैं, और आप एक ऐसी तालिका डिज़ाइन करने के दोषी हैं जो दोहराए जाने वाले समूहों के साथ पहले सामान्य फ़ॉर्म का उल्लंघन करता है
. यदि ऐसा है, तो शायद फ़ील्ड 1 से फ़ील्ड 4 एक बच्चे की तालिका में एक कॉलम में हैं। तब अनुक्रमणिका और क्वेरी करना बहुत आसान हो जाता है:
SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'