ऐसा लगता है कि, किसी कारण से, MySQL
इंडेक्स SIL
. का उपयोग करना चुनता है पहली तालिका पर और यह लुकअप के लिए दोनों का उपयोग करता है (WHERE sil_id = 4601038
) और ग्रुपिंग (GROUP BY cu.Id
)।
आप इसे PK
. का उपयोग करने के लिए कह सकते हैं टेबल के
SELECT cu.Href, COUNT(p.CatUrlId) FROM cat_urls cu
USE INDEX FOR JOIN (PRIMARY)
JOIN products p ON p.CatUrlId=cu.Id
WHERE sil_id=4601038
GROUP by cu.Id
और यह इस निष्पादन योजना को तैयार करेगा:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
---+-------------+-------+-------+---------------+---------+---------+------------------+------+-------------
1 | SIMPLE | cu | index | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where
1 | SIMPLE | p | ref | CatUrl | CatUrl | 4 | cbs-test-1.cu.Id | 1 | Using index
कॉलम rows
में रिपोर्ट किए गए मानों पर ध्यान न दें ; वे सही नहीं हैं क्योंकि मेरी टेबल खाली हैं।
ध्यान दें Extra
कॉलम में अब केवल Using where
लेकिन यह भी ध्यान दें कि शामिल हों type
कॉलम ref
. से बदला गया (बहुत अच्छा) से index
(पूर्ण अनुक्रमणिका स्कैन, बहुत अच्छा नहीं)।
कॉलम SIL_Id
. पर एक इंडेक्स जोड़ना एक बेहतर उपाय है . मुझे पता है, SIL_Id
अनुक्रमणिका का उपसर्ग है SIL(SIL_Id, AsCatId)
और सैद्धांतिक रूप से कॉलम पर एक और इंडेक्स SIL_Id
पूरी तरह से बेकार है। लेकिन ऐसा लगता है कि यह इस मामले में इस मुद्दे को हल करता है।
ALTER TABLE cat_urls
ADD INDEX (SIL_Id)
;
अब इसे क्वेरी में प्रयोग करें:
SELECT cu.Href, COUNT(p.CatUrlId) FROM cat_urls cu
USE INDEX FOR JOIN (SIL_Id)
JOIN products p ON p.CatUrlId=cu.Id
WHERE sil_id=4601038
GROUP by cu.Id
क्वेरी निष्पादन योजना अब बहुत बेहतर दिखती है:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
---+-------------+-------+------+---------------+--------+---------+------------------+------+-------------
1 | SIMPLE | cu | ref | SIL_Id | SIL_Id | 4 | const | 1 | Using where
1 | SIMPLE | p | ref | CatUrl | CatUrl | 4 | cbs-test-1.cu.Id | 1 | Using index
दोष यह है कि हमारे पास एक अतिरिक्त अनुक्रमणिका है जो (सैद्धांतिक रूप से) बेकार है। यह भंडारण स्थान घेरता है और हर बार एक पंक्ति जोड़ने, हटाने या उसका SIL_Id
होने पर यह प्रोसेसर चक्रों का उपभोग करता है फ़ील्ड संशोधित.