2012-03-22 12 views
13

मेरे पास आईएनटी के कॉलम के साथ 200k प्रविष्टियों की एक तालिका है। मैं प्रश्नों को तेजी से बनाने के लिए एक सूचकांक बनाना चाहता हूं। यह वह क्वेरी है जिसे मैं निष्पादित करना चाहता हूं: SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43)। मैंने निम्नलिखित अनुक्रमणिका बनाई: B, ACD, C, ABCMySQL। "OR" प्रश्नों के लिए एक इंडेक्स बनाना

EXPLAIN कमांड के साथ मैंने पाया कि MySQL सूचकांक ACD चुनता है। तो मैंने टेबल को अधिक मूल्यों के साथ पॉपुलटिंग रखा और मुझे एहसास हुआ कि MySQL उपरोक्त इंडेक्स के बीच स्विच कर रहा था (हमेशा एक ही नहीं)।

चूंकि कई प्रविष्टियां हैं, इसलिए विभिन्न इंडेक्स होने से प्रदर्शन के मुद्दों का कारण बन जाएगा और हम यह मान सकते हैं कि इस तालिका को अन्य प्रश्नों से एक्सेस किया जाता है, जिनके लिए प्रत्येक कॉलम समझ में आता है।

मुझे USE INDEX() से अवगत है, लेकिन मैं समझना चाहता हूं कि हमें सही सूचकांक चुनने के लिए MySQL पर भरोसा करना चाहिए या नहीं।

+2

आपका क्या मतलब है "हम मान सकते हैं कि इस तालिका को अन्य प्रश्नों से एक्सेस किया गया है जिसके लिए विभिन्न कॉलम की आवश्यकता होती है जहां हर इंडेक्स समझ में आता है"? क्या आप ऐसे प्रश्नों के कुछ उदाहरण दे सकते हैं? क्या आप हमें 'टेबल से क्वेरी' इंडेक्स का आउटपुट भी दे सकते हैं? ए, एबी और एसी पर इंडेक्स निश्चित रूप से अनावश्यक हैं: ये पहले ही एसीडी/एबीसी, एबीसी और एसीडी पर इंडेक्स द्वारा कवर किए गए हैं। आप इस बारे में पढ़ सकते हैं कि MySQL मल्टी-कॉलम इंडेक्स को http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – Daan

+0

पर पूछताछ कैसे करें: 'तालिका से बी प्राप्त करें जहां बी = 12'। ठीक है, मैं ए, एबी, एसी (धन्यवाद) को खत्म कर सकता हूं। लेकिन यह अभी भी 'एसीडी 'का उपयोग करने के कारण की व्याख्या नहीं करता है। जब 'WH' 'WHERE' कथन में भी नहीं होता है। –

+0

हां, यह थोड़ा रहस्यमय है: 'तालिका से क्वेरी दिखाएं' क्वेरी का आउटपुट यह देखने में मदद कर सकता है कि यह क्यों हो रहा है :) – Daan

उत्तर

6

उपयोगी होगा।

मैं इस निष्कर्ष पर पहुंचा कि INDEX का उपयोग करके इस समस्या को हल करने का तरीका दो अलग-अलग प्रश्न पूछना है। SELECT A,B,C,D,E FROM table WHERE A=23 AND B=45 जो INDEX ABC और फिर SELECT A,B,C,D,E FROM table WHERE A=23 AND C=43 का उपयोग करेगा जो INDEX ACD का उपयोग करेगा। यह सब (...) UNION (...) के साथ एक चरण में किया जा सकता है, जो जल्दी हो जाता है और केवल INDEX के उपयोग करता है।

1

माइस्क्ल केवल एक समग्र सूचकांक के 'बाएं सबसे अधिक' भाग का उपयोग कर सकता है। यानी, अपने जहां खंड की तरह

WHERE A=1 AND B=2 

तो MySQL A या AB पर एक सूचकांक का उपयोग कर सकते हैं, लेकिन AB सबसे अच्छा होगा लग रहा है। ACB का उपयोग नहीं किया जा सका क्योंकि इंडेक्स को दूसरे कॉलम द्वारा विभाजित किया गया है

आपके दिए गए WHERE खंड के साथ, मुझे नहीं लगता कि MySQL क्वेरी इंजन एकाधिक अनुक्रमणिका का उपयोग कर सकता है। मैं AB और AC और फोर्स इंडेक्स का उपयोग करके, देखें कि कौन सा तेज़ है।

एक तीन कॉलम समग्र कुंजी इस मामले में मदद नहीं करेगा क्योंकि आप ए और एक अन्य कॉलम के खिलाफ देख रहे हैं। OR के बजाय आपकी क्वेरी AND का उपयोग कर रही थी, तो इस प्रकार की कुंजी मदद करेगी। क्योंकि SQL विवरण में OR की, MySQL बस पहले सूचकांक कि A भी शामिल है, जो ACD है हो रही है ABC पर एक सूचकांक के लिए

WHERE A=1 AND B=2 AND C=3 
+2

हां, 'AND' के साथ यह एबीसी क्वेरी अपेक्षित के रूप में उपयोग करता है। 'ए', 'एबी', 'एसी' का उपयोग करना पहले टिप्पणी में @Daan द्वारा उल्लिखित अनावश्यक होगा। MySQL प्रलेखन से: "पंक्तियों को खोजने के लिए इंडेक्स के किसी भी बाएं उपसर्ग का उपयोग ऑप्टिमाइज़र द्वारा किया जा सकता है। 'INDEX' (col1, col2, col3) पर, आपने खोज क्षमताओं को सूचीबद्ध किया है (col1), (col1, col2), और (col1, col2, col3)। " –

+1

यह OR या नहीं, के बारे में एक प्रश्न है। –

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