2012-08-31 19 views
29

कई स्तंभों वाली एक तालिका की कल्पना करें, कहें, id, a, b, c, d, e। मैं आमतौर पर id द्वारा चुनता हूं, हालांकि, क्लाइंट ऐप में कई प्रश्न हैं जो कॉलम के सबसेट पर विभिन्न स्थितियों का उपयोग करते हैं।क्या MySQL एक ही क्वेरी के लिए एकाधिक अनुक्रमणिका का उपयोग कर सकता है?

जब MySQL एकाधिक कॉलम पर एकाधिक WHERE शर्तों के साथ एक तालिका पर एक क्वेरी निष्पादित करता है, तो क्या यह वास्तव में विभिन्न कॉलम पर बनाए गए इंडेक्स का उपयोग कर सकता है? या इसे तेजी से बनाने का एकमात्र तरीका सभी संभावित प्रश्नों के लिए बहु-कॉलम अनुक्रमणिका बनाना है?

+0

क्या आपके पास हमारे लिए एक प्रश्न का उदाहरण है? – ZombieCode

+6

@Ekaterina, привет :) प्रश्न में अभ्यास और अनुभव के लिए अपील करने वाले एक सामान्य प्रश्न को शामिल किया गया है, मुझे यकीन है कि यहां कोई विशिष्ट क्वेरी की आवश्यकता नहीं है। हालांकि मैं एक उदाहरण के बारे में सोच सकता हूं अगर यह – kolypto

उत्तर

47

हां, MySQL एक ही क्वेरी के लिए एकाधिक अनुक्रमणिका का उपयोग कर सकता है। अनुकूलक यह निर्धारित करेगा कि कौन से इंडेक्स क्वेरी को लाभान्वित करेंगे। MySQL कैसे एक कथन निष्पादित करता है, इस बारे में जानकारी प्राप्त करने के लिए आप EXPLAIN का उपयोग कर सकते हैं। तुम इतनी तरह जोड़ सकते हैं या उपेक्षा संकेत का उपयोग कर अनुक्रमित:

SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a; 

मैं how MySQL uses indexes पर पढ़ने का सुझाव होगा।

बस कुछ अंश:

यदि अनेक अनुक्रमित के बीच एक विकल्प है, MySQL सामान्य रूप से है कि पंक्तियों की सबसे छोटी संख्या पाता सूचकांक का उपयोग करता है।

यदि कॉल 1 और col2 पर एकाधिक-कॉलम अनुक्रमणिका मौजूद है, तो उचित पंक्तियों को सीधे लाया जा सकता है। यदि अलग-अलग सिंगल-कॉलम इंडेक्स को col1 और col2 पर मौजूद हैं, तो ऑप्टिमाइज़र इंडेक्स मर्ज ऑप्टिमाइज़ेशन (अनुभाग 8.3.1.4, "इंडेक्स मर्ज ऑप्टिमाइज़ेशन"), या का निर्णय करके सबसे प्रतिबंधित सूचकांक खोजने का प्रयास करेगा। सूचकांक पंक्तियों को लाने के लिए कम पंक्तियां और उस अनुक्रमणिका का उपयोग करके पाता है।

+2

वाह बनाता है वाह या तो कुछ नया है या मैं दस्तावेज़ों में इसे याद करने में कामयाब रहा हूं। धन्यवाद, यह दिलचस्प है :) वैसे भी, विशिष्ट मामलों के लिए एक बहु-स्तंभ सूचकांक अधिक प्रदर्शनकारी होना चाहिए। – kolypto

15

क्लासिकल, MySQL किसी दिए गए प्रश्न में प्रति तालिका संदर्भ में एक इंडेक्स का उपयोग कर सकता है। हालांकि, MySQL के हाल के संस्करणों में, index merge नामक एक ऑपरेशन हो सकता है और MySQL प्रति तालिका एक से अधिक इंडेक्स का उपयोग करने की अनुमति देता है।

http://openquery.com/blog/mysql-50-index-merge-using-multiple-indexes

+3

मुझे लगता है कि आपको इसे संपादित करना चाहिए: * "प्रति तालिका एक सूचकांक का उपयोग कर सकते हैं ** संदर्भ **" * –

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