Wednesday 15 September 2010

mysql - How to avoid full table scan for mutliple searcheable columns query? -


मेरे पास निम्न तालिका है A:

  id | Col1 | Col2 | Col3 | ... | Col66 ------------------------------------- 99 9 | 1 | 0 | 0 | ... | 1   

सभी कॉलम कॉल एक्स सर्च करने योग्य हैं और उनमें से 66 हैं जिसका मतलब है कि कुशल सूचक बनाना संभव नहीं है (कम से कम मुझे ऐसा लगता है)।

प्रश्न ये देख सकते हैं:

  तालिका से चयन आईडी जहां col21 = 1 और col31 = 1 और col64 = 1   

जैसा कि आप देख सकते हैं कि केवल कुछ कॉलम '1' पर सेट होने के साथ मुझे पंक्तियों को पुनः प्राप्त करने की आवश्यकता है स्तंभों का सेट भिन्न हो सकता है क्या आप इसे पूर्ण मेज पर बिना स्कैन करने के किसी भी तरीके से जानते हैं जो कि समय लेने वाली है? मुझे लगता है कि मैंने पहले से सबकुछ कोशिश की है, लेकिन कोई भाग्य नहीं के साथ :-( धन्यवाद!

क्वेरी की तरह यह:

  तालिका से चयन आईडी जहां col21 = 1 और col31 = 1 और col64 = 1   

तेजी से काम करने के लिए, आपने कम्पाउंड इंडेक्स बनाया होगा जो मुझे लगता है कि आप अपेक्षित क्षेत्रों की सूची का अनुमान नहीं लगा सकते हैं, इसलिए संभवत: यह आपके लिए काम नहीं करेगा - जब तक कि आप बड़ी संख्या में इंडेक्सस बनाने के लिए तैयार नहीं हैं ।

बेहतर विकल्प आपकी तालिका को सामान्य करने के लिए है - दास तालिका बनाएं, जो एक विशेषता को एक अलग पंक्ति में संग्रहीत करेगी। यह अनुक्रमण को बहुत आसान बना देगा, और यह भी मनमाना गुणों को रखने के लिए संभव बनाता है।

UPDATE : अपने 0/1 कॉलम को बदलने के लिए एक और संभावना है। अगर आज आपके पास एक 32-बिट प्राथमिक कुंजी और 66 छोटे गुण स्तंभ हैं, तो पंक्ति चौड़ाई 4 + 66 = 70 बाइट्स यदि आप बिट डेटा प्रकार का उपयोग करते हैं (आपको 2 बिट कॉलम, बीक की आवश्यकता होगी MySQL में एएसई अधिकतम बिट आकार 64 बिट है), पंक्ति चौड़ाई 4+ (66/8) = 13 बाइट्स या पहले की तुलना में लगभग 5 गुना कम हो जाती है। अगर आज अपना पूर्ण स्कैन समय 0.4 सेकंड है, तो यह पैकिंग के साथ 0.08 सेकेंड होगा, जो आपके लिए स्वीकार्य हो सकता है।

No comments:

Post a Comment