2011-05-02 12 views
7

मैं एक ऐसी स्क्रिप्ट लिख रहा हूं जो एक क्वेरी के आधार पर एक रिपोर्ट उत्पन्न करता है जो कई तालिकाओं का एक साथ जुड़ता है। लिपि में इनपुट में से एक रिपोर्ट रिपोर्ट पर आवश्यक फ़ील्ड की एक सूची होगी। अनुरोध किए गए फ़ील्ड के आधार पर, कुछ तालिकाओं की आवश्यकता नहीं हो सकती है। मेरा सवाल है: क्या इसमें शामिल होने के लिए एक [महत्वपूर्ण] प्रदर्शन जुर्माना है जब इसे किसी चयन या कहां खंड में संदर्भित नहीं किया जाता है?अप्रयुक्त जॉइन के लिए प्रदर्शन दंड

SELECT 
    `Authors`.`lastName` 
FROM 
    `Authors` 
JOIN 
    `Books` 
    ON `Authors`.`id` = `Books`.`authorId` 
WHERE 
    `Authors`.`id` = 1 

:

mysql> SELECT * FROM `Books`; 
+----------------------+----------+ 
| title    | authorId | 
+----------------------+----------+ 
| Animal Farm   |  3 | 
| Brave New World  |  2 | 
| Fahrenheit 451  |  1 | 
| Nineteen Eighty-Four |  3 | 
+----------------------+----------+ 

mysql> SELECT * FROM `Authors`; 
+----+----------+-----------+ 
| id | lastName | firstName | 
+----+----------+-----------+ 
| 1 | Bradbury |  Ray | 
| 2 | Huxley | Aldous | 
| 3 | Orwell | George | 
+----+----------+-----------+ 

SELECT 
    `Authors`.`lastName` 
FROM 
    `Authors` 
WHERE 
    `Authors`.`id` = 1 

मात करता है:

निम्न तालिकाओं पर विचार करें?

ऐसा लगता है कि MySQL को पूरी तरह से जॉइन को अनदेखा करना चाहिए, क्योंकि तालिका को चयन या कहां खंड में संदर्भित नहीं किया गया है। लेकिन किसी भी तरह मुझे संदेह है कि यह मामला है। बेशक, यह वास्तव में एक मूल उदाहरण है। शामिल वास्तविक डेटा अधिक जटिल होगा।

और वास्तव में, यह एक बहुत बड़ा सौदा नहीं है ... मुझे सिर्फ यह जानने की ज़रूरत है कि मेरी स्क्रिप्ट को शामिल होने के बारे में "स्मार्ट" होना चाहिए, और केवल उनको शामिल करें यदि अनुरोध किए गए फ़ील्ड उन पर भरोसा करेंगे।

+0

आपके द्वारा सूचीबद्ध किए गए मामले वास्तव में अलग-अलग परिणाम लौटा सकते हैं। जब आप टेबल में शामिल हो जाते हैं तो लौटाए गए परिणाम सभी लेखकों नहीं होंगे, वे सभी लेखकों होंगे जिन्होंने एक पुस्तक लिखी है। –

+0

ओह, अच्छा बिंदु ... क्या होगा यदि यह बाएं शामिल हो? फिर यह पूरी तरह से अनावश्यक है और एक ही परिणाम देता है। उस स्थिति में, मुझे आश्चर्य है कि इसमें शामिल होने के लिए प्रदर्शन लाभ होगा या नहीं? –

+0

ओह, लेकिन बाएं जुड़ने के साथ भी, डुप्लिकेट की संभावना होगी (इस मामले में, यदि WHERE क्लॉज था: 'लेखक'। 'id' = 3)। तो MySQL को हमेशा यह देखना होगा कि उस तालिका में पहले क्या है ... तो यह हमेशा प्रदर्शन में कम से कम एक बूंद होने जा रहा है। समझ गया। धन्यवाद! –

उत्तर

3

यह वास्तव में अप्रयुक्त नहीं है क्योंकि इसका मतलब है कि पुस्तकों में मौजूद केवल लेखक ही परिणाम सेट में शामिल हैं।

JOIN 
    `Books` 
    ON `Authors`.`id` = `Books`.`authorId` 

लेकिन यदि आप "पता था कि" यह है कि हर लेखक पुस्तक में ही अस्तित्व में से वहाँ में शामिल होने को दूर करने में कुछ प्रदर्शन लाभ होगा, लेकिन यह idexes पर काफी हद तक निर्भर करते हैं और चाहते हैं तालिका में अभिलेखों की संख्या और तर्क में शामिल हों (विशेष रूप से डेटा रूपांतरण करते समय)

1

जॉइन हमेशा समय लेते हैं।

दुष्प्रभाव
कि inner join के शीर्ष (जो डिफ़ॉल्ट है में शामिल होने) पर पंक्तियों में आप प्राप्त की संख्या सीमित करके परिणाम को प्रभावित करती है। इस पर निर्भर करता है कि authorsbooks में हैं, तो दो प्रश्न समान हो सकते हैं या नहीं भी हो सकते हैं।

यदि author ने एक से अधिक book लिखा है तो 'शामिल' क्वेरी का परिणाम डुप्लिकेट परिणाम दिखाएगा।

प्रदर्शन
WHERE खंड आप authors.id कहा है इसलिए (बशर्ते आप author.id और books.author_id सूचक है), एक निरंतर =1 होने की यह दोनों तालिकाओं के लिए एक बहुत तेजी से देखने होना होगा। दो तालिकाओं के बीच क्वेरी-टाइम बहुत करीब होगा।

सामान्य जॉइन में काफी समय लग सकता है हालांकि सभी अतिरिक्त साइड इफेक्ट्स केवल तभी किए जाने चाहिए जब आप वाकई अतिरिक्त जानकारी का उपयोग करना चाहते हैं।

1

यह ऐसा प्रश्न है जो उत्तर देना असंभव है।हां, शामिल होने में अतिरिक्त समय लगेगा; यह बताना असंभव है कि आप बिना उस समय को मापने में सक्षम होंगे, ठीक है, ओह .... समय को मापना।

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

यदि आपके पास अधिक जटिल जुड़ाव है (जिसे आप संकेत देते हैं), या इंडेक्स के बिना फ़ील्ड में शामिल हो रहे हैं, या यदि आपके जॉइन में कोई फ़ंक्शन शामिल है, तो प्रदर्शन जुर्माना महत्वपूर्ण हो सकता है।

बेशक, यह अभी भी ऐसा करना आसान हो सकता है जो अनियंत्रित जुड़ने के अलावा अन्य प्रश्नों को अनिवार्य रूप से वही लिखता है।

सलाह का अंतिम बिट - प्रश्नों को प्रश्नों में सारणीबद्ध करने का प्रयास करें। इस तरह, आप एक बार प्रदर्शन को अनुकूलित कर सकते हैं, और शायद अपनी रिपोर्ट क्वेरी को अधिक सरल तरीके से लिख सकते हैं ...

0

ऐसा लगता है कि दो चीजें हैं जिन्हें आप निर्धारित करने की कोशिश कर रहे हैं: यदि कोई अनुकूलन किया जा सकता है दो चयन बयानों के बीच, और दोनों में से कौन सा निष्पादन सबसे तेज़ होगा।

ऐसा लगता है कि चूंकि वास्तव में शामिल होने वाले लेखकों द्वारा लौटाए गए परिणामों को सीमित कर दिया गया है, जिनके पास सूची में किताबें हैं, कि इतना अनुकूलन नहीं किया जा सकता है।

ऐसा लगता है कि इस मामले के लिए कि आप कह रहे थे कि किस तालिका में वास्तव में लौटाए गए परिणामों पर कोई सीमित प्रभाव नहीं पड़ता है, वह क्वेरी जहां टेबलों में शामिल नहीं होने पर क्वेरी तेज होगी।

संबंधित मुद्दे