पर इंडेक्स उपयोग के बजाय माईस्कल रेंज चेक मुझे 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 कैसे बना सकता हूं?
मुझे लगता है कि MySQL सीधे यह निर्धारित नहीं कर सकता कि 20 मिलान पंक्तियों को खोजने के लिए इसे कितनी पंक्तियां पढ़नी चाहिए; इसलिए यह 20 मैचों के लिए बड़ी मेज का चयन करता है और फिर आंतरिक जुड़ता है। यदि आप सीमा को हटाते हैं तो क्या होता है? –
सीमा को हटाने से कुछ भी नहीं बदलता है। मैं बस सही इंडेक्स का उपयोग करके लिए MySQL की जरूरत रेंज की जांच –