2012-11-06 11 views
6

पर इंडेक्स उपयोग के बजाय माईस्कल रेंज चेक मुझे MySQL (innoDB) 5.0 के साथ गंभीर समस्या है।आंतरिक भाग

एक बहुत ही सरल SQL क्वेरी को एक बहुत ही अप्रत्याशित क्वेरी योजना के साथ निष्पादित किया जाता है।

क्वेरी:

SELECT 
SQL_NO_CACHE 
mbCategory.* 

FROM 
MBCategory mbCategory 

INNER JOIN ResourcePermission as rp 
    ON rp.primKey = mbCategory.categoryId 

where mbCategory.groupId = 12345 AND mbCategory.parentCategoryId = 0 
limit 20; 

MBCategory - 3,098,354 पंक्तियां हैं - 216,583 पंक्तियों

ResourcePermission शामिल हैं।

Primary (categoryId) 
A (groupId,parentCategoryId,categoryId) 
B (groupId,parentCategoryId) 

ResourcePermission में मैं कई अनुक्रमित (स्तंभों सूचकांक में के रूप में आदेश) है::

Primary - on some column 
A (primKey). 

जब मैं

MBCategory में मैं कई अनुक्रमित (स्तंभों सूचकांक में के रूप में आदेश) है क्वेरी प्लान में देखें MySQL तालिका तालिकाओं को बदलता है और पहले संसाधन संसाधन से पंक्तियों का चयन करता है और फिर यह एमबीसीएशन टेबल (पागल विचार) में शामिल होता है और इसमें उम्र लगती है। बजाय यह प्रदर्शन रेंज प्रत्येक रिकॉर्ड के लिए जाँच की (मेरी राय MySQL में में शामिल होने के संचालन पर index A (primKey) उपयोग करना चाहिए:

SELECT 

STRAIGHT_JOIN SQL_NO_CACHE 
mbCategory.* 

FROM 
MBCategory 
mbCategory 

INNER JOIN ResourcePermission as rp 
    ON rp.primKey = mbCategory.categoryId 

where mbCategory.groupId = 12345 AND mbCategory.parentCategoryId = 0 
limit 20; 

लेकिन यहाँ दूसरी समस्या materialzie: तो मैं सही तालिका अनुक्रम का उपयोग करने के InnoDB इंजन के लिए मजबूर करने STRAIGHT_JOIN जोड़ा सूचकांक मानचित्र: 0x400) और यह फिर से उम्र लेता है! फोर्स इंडेक्स मदद नहीं करता है, mysql अभी भी प्रत्येक रिकॉर्ड के लिए रेंज की जांच कर रहा है।

एमबीसी श्रेणी में केवल 23 पंक्तियां हैं जो मानदंडों को पूरा करती हैं, और इसमें शामिल होने के बाद केवल 75 पंक्तियां होती हैं। मैं इस ऑपरेशन पर सही इंडेक्स चुनने के लिए MySQL कैसे बना सकता हूं?

+0

मुझे लगता है कि MySQL सीधे यह निर्धारित नहीं कर सकता कि 20 मिलान पंक्तियों को खोजने के लिए इसे कितनी पंक्तियां पढ़नी चाहिए; इसलिए यह 20 मैचों के लिए बड़ी मेज का चयन करता है और फिर आंतरिक जुड़ता है। यदि आप सीमा को हटाते हैं तो क्या होता है? –

+0

सीमा को हटाने से कुछ भी नहीं बदलता है। मैं बस सही इंडेक्स का उपयोग करके लिए MySQL की जरूरत रेंज की जांच –

उत्तर

23

ठीक है, प्राथमिक समस्या। मुझे अपने आप को एक बियर देना है। प्रणाली मैं हाल ही में कर रहा हूँ ट्यूनिंग, एक प्रणाली मैं developted गया है नहीं है - मैं प्रदर्शन में सुधार करने के लिए अपने प्रबंधन द्वारा यह करने के लिए आवंटित किया गया है (originall टीम इस विषय पर ज्ञान नहीं है)।

एसक्यूएल प्रश्नों में सुधार लाने का शुल्क सप्ताह के बाद, अनुक्रमित, एसक्यूएल प्रश्नों मैं इस मामले में सबसे महत्वपूर्ण बातों में से एक की जाँच नहीं था कि आवेदन द्वारा निष्पादित beeing कर रहे हैं की संख्या !!

कॉलम प्रकार अलग हैं!

डेवलपर जो कोड के प्रकार से लिखे गए हैं, उन्हें काफी बड़ा टैंक मिलना चाहिए।

मदद के लिए धन्यवाद!

+0

यह उनका कहना है कि MySQL 5.7 इस स्थिति है, जहां एक 'गतिशील रेंज' का समर्थन किया जाएगा बेहतर बनाता है लायक है नहीं। कृपया इस ब्लॉग पोस्ट देखें: (। जो यहां से जोड़ता है) http://mysqlserverteam.com/dynamic-range-access-and-recent-changes/ –

+1

मैं भी अच्छी तरह से इस अंतर्दृष्टि –

+1

बहुत उपयोगी है, धन्यवाद आप देना है , मैं होगा - मैं भी आपको एक बियर देना चाहता हूं। – udog

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