Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

कहाँ का उपयोग करके ठीक करें; अस्थायी का उपयोग करना; फाइलसॉर्ट का उपयोग करना

ऐसा लगता है कि, किसी कारण से, 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 होने पर यह प्रोसेसर चक्रों का उपभोग करता है फ़ील्ड संशोधित.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. चयन के भीतर एक चर परिभाषित करें और इसे उसी चयन के भीतर उपयोग करें

  2. MySQL में SQL स्क्रिप्ट कैसे चलाएं?

  3. MySQL db को क्वेरी करना

  4. जेडीबीसी में विदेशी कुंजी समस्या

  5. MySql ERROR 1045 (28000):उपयोगकर्ता 'रूट' @ 'लोकलहोस्ट' के लिए प्रवेश निषेध (पासवर्ड का उपयोग करके:नहीं)