MySQL: लेफ्ट बाहरी जॉइन और इनर जॉइन के बीच कौन सा जुड़ाव बेहतर है


11

यदि सभी समान परिणाम प्रदान करते हैं तो कौन सा जुड़ाव बेहतर है? उदाहरण के लिए, मेरे पास दो टेबल हैं employees(emp_id,name, address, designation, age, sex)और work_log(emp_id,date,hours_wored)। कुछ विशिष्ट परिणाम प्राप्त करने के लिए दोनों inner joinऔर left joinएक ही परिणाम देता है। लेकिन, मुझे अभी भी कुछ संदेह हैं जो केवल इस सवाल तक सीमित नहीं हैं।

  • कौन सा अधिक कुशल है जो समान परिणाम मानों के मामले में पसंद करना चाहिए?
  • अन्य कारक क्या हैं जो आवेदन करने के समय में शामिल होने पर विचार किया जाना चाहिए?
  • क्या इनर जॉइन और क्रॉस जॉइन के बीच कोई संबंध है?

जवाबों:


15

"बेहतर" या "बदतर" प्रकार में शामिल नहीं है। उनके अलग-अलग अर्थ हैं और उनका उपयोग इसके आधार पर किया जाना चाहिए।

आपके मामले में, शायद आपके पास कोई काम करने वाले कर्मचारी नहीं हैं (उस तालिका में कोई पंक्तियाँ नहीं हैं), इसलिए LEFT JOINऔर JOINपरिणामों में समान होगा। हालांकि, अगर आप ऐसी बात (कोई पंजीकृत work_log साथ एक नए कर्मचारी), एक था JOINwold न आना है कि कर्मचारी है, जबकि एक बाएं (जिनकी पहली तालिका कर्मचारियों है) में शामिल होने के work_log से खेतों पर उन सभी को, और nulls दिखाई देते हैं अगर वहाँ मैच नहीं हैं।

JOIN प्रकार के दृश्य स्पष्टीकरण

फिर, प्रदर्शन शुद्धता को क्वेरी करने के लिए एक गौण बात है। कुछ लोग कहते हैं कि आपको LEFT JOINएस का उपयोग नहीं करना चाहिए । यह सच है कि एक LEFT JOIN कुछ मामलों में कुछ अनुकूलन (टेबल रीक्रोडिंग) को रोकने के लिए ऑप्टिमाइज़र को एक विशेष क्रम में क्वेरी को निष्पादित करने के लिए मजबूर करता है। यहाँ एक उदाहरण है । लेकिन आपको एक दूसरे को नहीं चुनना चाहिए यदि शुद्धता / अर्थ पवित्र है, क्योंकि INNER JOIN स्वाभाविक रूप से बदतर नहीं है। बाकी सामान्य अनुकूलन पहले की तरह लागू होते हैं।

सारांश में, LEFT JOINयदि आप वास्तव में मतलब नहीं है का उपयोग न करें INNER JOIN

MySQL में CROSS JOIN, INNER JOINऔर JOINएक ही हैं। मानक में, और अर्थ की दृष्टि से, एक CROSS JOINएक है INNER JOINएक के बिना ONखंड है, तो आप तालिकाओं के बीच पंक्तियों के प्रत्येक संयोजन मिलता है।

आपके पास विकिपीडिया पर सभी अर्थ प्रकार के जुड़ने के उदाहरण हैं । व्यवहार में, MySQL में, हम केवल लिखने के लिए जाते हैं JOINऔर LEFT JOIN


1
जीआर 8 स्पष्टीकरण @jynus। इसका सौभाग्य है कि मुझे मेरे प्रश्न का उत्तर आपसे केवल यही मिला।
११:०४ बजे ursitesion

1 प्रासंगिक ग्राफिक 1000 शब्दों से बेहतर है। इसे आपने बनाया?
Fr0zenFyr

नहीं, मैं नहीं किया था, रोपण छवि के नीचे स्थित है codeproject.com/Articles/33052/... - हालांकि चित्र वेन का उपयोग कर का प्रतिनिधित्व करने के मिलती है इसके बीजीय औपचारिक रूप पुराना है: en.wikipedia.org/wiki/Relational_algebra
jynus

मैंने टिप्पणियों के एक सेट पर शुरू किया, फिर महसूस किया कि यह सब उबलता है - यह आपकी क्वेरी पर निर्भर करता है। मुझ से +1!
इहानी


0

यदि उनमें से सभी एक ही परिणाम प्रदान करते हैं तो कौन सा प्रदर्शन बेहतर है?

मैं पिछले उत्तर के अलावा, जो मैं जानता हूं, उसी प्रदर्शन के लिए MySQL अनुकूलित है।

अच्छे अनुक्रमों के साथ, उदाहरण के लिए, फ़िल्टर करने के लिए JOINबनाम LEFT JOIN+ WHEREखंड, एक ही बात होगी। ऑप्टिमाइज़ेशन बनाम ह्यूमन रीडिंग बहुत सारे जॉइन के साथ बड़े क्वेश्चन पर काम करता है।

अच्छे इंडेक्स और कैश का उपयोग करना अधिक महत्वपूर्ण है।

आप यहाँ अनुकूलन प्रक्रिया की एक अच्छी व्याख्या पढ़ सकते हैं:

क्वेरी ऑप्टिमाइज़ेशन प्रक्रिया : एक क्वेरी को अक्सर कई अलग-अलग तरीकों से निष्पादित किया जा सकता है और एक ही परिणाम उत्पन्न कर सकता है। आशावादी का काम सबसे अच्छा विकल्प खोजना है।


0

यह मेरे लिए, MySql 5.7 8 vCPU, 52 GB RAM के समान नहीं है

निम्नलिखित क्वेरी में ~ 30 सेकंड लगते हैं, निश्चित नहीं कि क्यों

लेनदेन तालिका में 24,257,151 रिकॉर्ड हैं

गतिविधि तालिका में 18,603,665 रिकॉर्ड हैं

खरीद तालिका में 13,911,705 रिकॉर्ड हैं

सभी आवश्यक सूचकांक जगह में हैं

SELECT
    `trx`.`transaction_pk`,
    `trx`.`created`,
    `trx`.`updated`,
    `p`.`amount`,
    `trxst`.`name`,
    COALESCE ( a.units, 0 ) AS units
FROM
    `transaction` AS `trx`
    INNER JOIN `transaction_sub_type` AS `trxst` ON  `trx`.`transaction_sub_type_fk`= `trxst`.`transaction_sub_type_pk`
    left JOIN `activity` AS `a` ON `a`.`transaction_fk` = `trx`.`transaction_pk`
    LEFT JOIN `purchases` AS `p` ON `p`.`transaction_fk` = `trx`.`transaction_pk` 
WHERE
    `trx`.`entity_fk` IN ( 1234) 
    AND `trx`.`transaction_sub_type_fk` IN (
    2, 4, 5, 15, 16, 33, 37, 38, 85, 86, 87, 88, 102, 103 
    ) 
ORDER BY
    `trx`.`transaction_pk` DESC LIMIT 100 OFFSET 0;

निम्नलिखित पंक्ति को प्रतिस्थापित करने के बाद:

INNER JOIN `transaction_sub_type` AS `trxst` ON  `trx`.`transaction_sub_type_fk`= `trxst`.`transaction_sub_type_pk`

बाईं ओर के साथ

LEFT JOIN `transaction_sub_type` AS `trxst` ON  `trx`.`transaction_sub_type_fk`= `trxst`.`transaction_sub_type_pk`

एक ही क्वेरी ~ 0.046s लेता है

पहले समझाएं:

1   SIMPLE  trxst       ALL PRIMARY             101 37.62   Using where; Using temporary; Using filesort
1   SIMPLE  trx     ref transaction_sub_type_fk,entity_fk   transaction_sub_type_fk 4   trxst.transaction_sub_type_pk   2548    0.36    Using where
1   SIMPLE  a       ref transaction_fk  transaction_fk  4   trx.transaction_pk  1   100 
1   SIMPLE  p       ref transaction_fk  transaction_fk  4   trx.transaction_pk  1   100 

इसके बाद स्पष्ट करें:

1   SIMPLE  trx     ref transaction_sub_type_fk,entity_fk   entity_fk   4   const   81474   83.65   Using where
1   SIMPLE  trxst       eq_ref  PRIMARY PRIMARY 4   trx.transaction_sub_type_fk 1   100 
1   SIMPLE  a       ref transaction_fk  transaction_fk  4   trx.transaction_pk  1   100 
1   SIMPLE  p       ref transaction_fk  transaction_fk  4   trx.transaction_pk  1   100 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.