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

MySQL क्वेरी बहुत धीमी है

प्रदर्शन में अंतर संभवतः . है e.id_dernier_fichier . के कारण जॉइन के लिए इस्तेमाल किए गए इंडेक्स में होना, लेकिन e.codega उस में नहीं होना सूचकांक।

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


हालाँकि, अभी के लिए, मैं कुछ बातों के बारे में विस्तार से बता सकता हूँ...

यदि कोई इंडेक्स क्लस्टर किया गया है (यह प्राथमिक कुंजी पर भी लागू होता है), तो डेटा वास्तव में इंडेक्स के क्रम में भौतिक रूप से संग्रहीत होता है। इसका मतलब है कि आप जानना चाहते हैं स्थिति x INDEX में भी निहितता का अर्थ है कि आप स्थिति x want चाहते हैं तालिका में।

यदि INDEX क्लस्टर नहीं है, तथापि, INDEX केवल आपके लिए एक लुकअप प्रदान कर रहा है। प्रभावी ढंग से स्थिति x . कह रहा है INDEX में स्थिति y . से मेल खाती है तालिका में।

यहां महत्व तब है जब INDEX में निर्दिष्ट फ़ील्ड तक पहुँच प्राप्त नहीं की गई है। ऐसा करने का मतलब है कि आपको डेटा प्राप्त करने के लिए वास्तव में टेबल पर जाना होगा। क्लस्टर किए गए इंडेक्स के मामले में, आप पहले से ही वहां हैं, उस फ़ील्ड को खोजने का ओवरहेड बहुत कम है। यदि INDEX को क्लस्टर नहीं किया गया है, हालांकि, आपको प्रभावी रूप से TABLE को INDEX में शामिल करना होगा, फिर उस फ़ील्ड को खोजें जिसमें आप रुचि रखते हैं।


टिप्पणी; (id_dernier_fichier, codega) . पर कंपोजिट इंडेक्स होना सिर्फ (id_dernier_fichier) . पर एक इंडेक्स होने से बहुत अलग है और केवल (codega) . पर एक अलग अनुक्रमणिका ।


आपकी क्वेरी के मामले में, मुझे नहीं लगता कि आपको कोड को बिल्कुल भी बदलने की आवश्यकता है। लेकिन आप हो सकता है अनुक्रमणिका बदलने से लाभ।

आप उल्लेख करते हैं कि आप कई . तक पहुंचना चाहते हैं खेत। उन सभी क्षेत्रों को एक समग्र सूचकांक में रखना संभवतः सबसे अच्छा समाधान नहीं है। इसके बजाय आप (id_dernier_fichier) पर एक CLUSTERED INDEX बनाना चाह सकते हैं . इसका मतलब यह होगा कि एक बार *id_dernier_fichier* स्थित हो जाने के बाद, आप अन्य सभी क्षेत्रों को भी प्राप्त करने के लिए पहले से ही सही जगह पर हैं।


संपादित करें MySQL और CLUSTERED INDEXes के बारे में नोट

13.2.10.1। क्लस्टर्ड और सेकेंडरी इंडेक्स

प्रत्येक InnoDB तालिका में एक विशेष अनुक्रमणिका होती है जिसे संकुल अनुक्रमणिका कहा जाता है जहाँ पंक्तियों के लिए डेटा संग्रहीत किया जाता है:

  • यदि आप अपनी टेबल पर प्राथमिक कुंजी परिभाषित करते हैं, तो InnoDB इसे क्लस्टर इंडेक्स के रूप में उपयोग करता है।
  • यदि आप अपनी तालिका के लिए प्राथमिक कुंजी को परिभाषित नहीं करते हैं, तो MySQL पहला UNIQUE इंडेक्स चुनता है जिसमें प्राथमिक कुंजी के रूप में केवल NOT NULL कॉलम होते हैं और InnoDB इसे क्लस्टर इंडेक्स के रूप में उपयोग करता है।
  • यदि तालिका में कोई प्राथमिक कुंजी या उपयुक्त UNIQUE अनुक्रमणिका नहीं है, तो InnoDB पंक्ति आईडी मानों वाले सिंथेटिक कॉलम पर आंतरिक रूप से एक छिपा हुआ क्लस्टर इंडेक्स उत्पन्न करता है। पंक्तियों को आईडी द्वारा आदेश दिया जाता है कि InnoDB ऐसी तालिका में पंक्तियों को असाइन करता है। पंक्ति आईडी एक 6-बाइट फ़ील्ड है जो नई पंक्तियों को सम्मिलित करते ही एकरस रूप से बढ़ जाती है। इस प्रकार, पंक्ति आईडी द्वारा आदेशित पंक्तियाँ भौतिक रूप से सम्मिलन क्रम में हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. इसकी सेवा को रोकने का प्रयास करते समय MySQL-Linux त्रुटि

  2. SQLite के साथ क्रिएट इंडेक्स को सही तरीके से कैसे करें

  3. बिना किसी प्राइम कुंजी वाली पुरानी तालिका में प्राथमिक कुंजी कॉलम जोड़ें

  4. मैसकल डेटाबेस के साथ सोलर सर्च, डेटा आयात करने के लिए कोई भी उपयोगिता

  5. MySQL:वैकल्पिक तालिका यदि स्तंभ मौजूद नहीं है