InnoDB में प्रत्येक अनुक्रमणिका में प्राथमिक कुंजी निहित होती है।
व्याख्या योजना से पता चलता है कि सूचकांक IDX_NOME टेबल पर प्रयोग किया जाता है Paziente . DBMS इंडेक्स में नाम ढूंढता है और ID_PAZIENTE . ढूंढता है वहां, वह कुंजी है जिसे हमें दूसरी तालिका तक पहुंचने की आवश्यकता है। तो जोड़ने के लिए कुछ भी नहीं है। (दूसरे DBMS में हमने (NOME, ID_PAZIENTE) पर एक कंपोजिट इंडेक्स जोड़ा होता ऐसा होने के लिए।)
फिर टेबल है Analisi विचार करने के लिए। हमें FK_ANALISI_PAZIENTE . के माध्यम से एक रिकॉर्ड मिलता है जिसमें ID_PAZIENTE . है जिसका उपयोग मिलान खोजने के लिए किया जाता है, और परोक्ष रूप से प्राथमिक कुंजी ID_ANALISI जिसका उपयोग तालिका तक पहुँचने के लिए किया जा सकता है, लेकिन यह आवश्यक भी नहीं है, क्योंकि हमारे पास वह सभी जानकारी है जो हमें सूचकांक से चाहिए। ऐसा कुछ भी नहीं बचा है जिसे हमें तालिका में खोजने की आवश्यकता हो। (फिर से, दूसरे DBMS में हम (ID_PAZIENTE, ID_ANALISI) पर एक कंपोजिट इंडेक्स जोड़ देते। कवरिंग इंडेक्स रखने के लिए।)
तो क्या होता है:गिनने के लिए दूसरे इंडेक्स को पढ़ने के लिए एक इंडेक्स पढ़ें। उत्तम। जोड़ने के लिए कुछ नहीं है।
हम कर सकते थे COUNT(analisi0_.ID_ANALISI) . को बदलें COUNT(*) . के साथ जैसा कि पूर्व केवल कहता है "रिकॉर्ड गिनें जहां ID_ANALISI शून्य नहीं है", जो हमेशा ID_ANALISI . के रूप में होता है तालिका की प्राथमिक कुंजी है। तो बाद वाले का उपयोग करना और "रिकॉर्ड गिनना" कहना आसान है। हालांकि, मुझे यह उम्मीद नहीं है कि यह क्वेरी को काफी तेज करेगा यदि बिल्कुल भी।
तो एक प्रश्न के दृष्टिकोण से, इसे तेज करने के लिए कुछ भी नहीं है। यहाँ और बातें हैं जो दिमाग में आती हैं:
- विभाजित टेबल? नहीं, मुझे इसमें कोई फायदा नहीं दिखेगा। क्वेरी को समानांतर धागे में निष्पादित किया गया था, यह तेज़ हो सकता था, लेकिन जहां तक मुझे पता है, MySQL में एकाधिक विभाजनों पर समानांतर निष्पादन नहीं है। (हालांकि मैं गलत हो सकता हूं।)
- टेबल को डीफ़्रैग्मेन्ट करना? नहीं, टेबल को क्वेरी में भी एक्सेस नहीं किया जाता है।
- इससे हमें मिलता है:बेहतर हार्डवेयर खरीदें। (क्षमा करें, आपके लिए कोई बेहतर सलाह नहीं है।)