असली सवाल यह है कि क्या इन रिकॉर्डों में एक-से-एक संबंध या एक-से-कई संबंध हैं ?
TLDR उत्तर:
यदि एक-से-एक, एक JOINकथन का उपयोग करें ।
यदि एक-से-कई, SELECTसर्वर-साइड कोड अनुकूलन के साथ एक (या कई) बयानों का उपयोग करें ।
अनुकूलन के लिए चयन क्यों और कैसे करें
SELECTएक से कई संबंधों के आधार पर रिकॉर्ड के बड़े समूह पर 'आईएनजी (जॉइन के बजाय कई प्रश्नों के साथ) एक इष्टतम दक्षता पैदा करता है, क्योंकि JOIN' आईएनजी में एक घातीय मेमोरी लीक मुद्दा है। सभी डेटा को पकड़ो, फिर इसे सॉर्ट करने के लिए सर्वर-साइड स्क्रिप्टिंग भाषा का उपयोग करें:
SELECT * FROM Address WHERE Personid IN(1,2,3);
परिणाम:
Address.id : 1 // First person and their address
Address.Personid : 1
Address.City : "Boston"
Address.id : 2 // First person's second address
Address.Personid : 1
Address.City : "New York"
Address.id : 3 // Second person's address
Address.Personid : 2
Address.City : "Barcelona"
यहाँ, मुझे सारे रिकॉर्ड मिल रहे हैं, एक चुनिंदा स्टेटमेंट में। यह उससे बेहतर है JOIN, जो इन रिकॉर्ड्स का एक छोटा समूह, एक समय में, एक अन्य क्वेरी के उप-घटक के रूप में प्राप्त कर रहा होगा। फिर मैं इसे सर्वर-साइड कोड के साथ पार्स करता हूं जो कुछ इस तरह दिखता है ...
<?php
foreach($addresses as $address) {
$persons[$address['Personid']]->Address[] = $address;
}
?>
जब अनुकूलन के लिए शामिल होने का उपयोग करने के लिए नहीं
JOIN'एक एकल रिकॉर्ड के साथ एक-से-एक संबंध के आधार पर रिकॉर्ड के एक बड़े समूह को सम्मिलित करना, कई SELECTबयानों की तुलना में एक इष्टतम दक्षता पैदा करता है , एक के बाद एक, जो बस अगले रिकॉर्ड प्रकार को प्राप्त करते हैं।
लेकिन JOINएक-से-कई संबंधों के साथ रिकॉर्ड बनाते समय अक्षम है।
उदाहरण: डेटाबेस ब्लॉग में रुचि के 3 टेबल हैं, Blogpost, Tag और Comment।
SELECT * from BlogPost
LEFT JOIN Tag ON Tag.BlogPostid = BlogPost.id
LEFT JOIN Comment ON Comment.BlogPostid = BlogPost.id;
यदि 1 ब्लॉगपोस्ट, 2 टैग और 2 टिप्पणियाँ हैं, तो आपको परिणाम मिलेंगे:
Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag2, comment1,
Row4: tag2, comment2,
ध्यान दें कि प्रत्येक रिकॉर्ड को कैसे दोहराया जाता है। ठीक है, इसलिए, 2 टिप्पणियाँ और 2 टैग 4 पंक्तियाँ हैं। यदि हमारे पास 4 टिप्पणियाँ और 4 टैग हैं तो क्या होगा? आपको 8 पंक्तियाँ नहीं मिलतीं - आपको 16 पंक्तियाँ मिलती हैं:
Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag1, comment3,
Row4: tag1, comment4,
Row5: tag2, comment1,
Row6: tag2, comment2,
Row7: tag2, comment3,
Row8: tag2, comment4,
Row9: tag3, comment1,
Row10: tag3, comment2,
Row11: tag3, comment3,
Row12: tag3, comment4,
Row13: tag4, comment1,
Row14: tag4, comment2,
Row15: tag4, comment3,
Row16: tag4, comment4,
अधिक तालिकाओं, अधिक रिकॉर्ड आदि को जोड़ें, और समस्या सैकड़ों पंक्तियों को जल्दी से फुलाएगी जो कि ज्यादातर अनावश्यक डेटा से भरी हुई हैं ।
इन डुप्लिकेट्स की क्या कीमत है? मेमोरी (SQL सर्वर में और कोड जो डुप्लिकेट को निकालने की कोशिश करता है) और नेटवर्किंग संसाधन (SQL सर्वर और आपके कोड सर्वर के बीच)।
स्रोत: https://dev.mysql.com/doc/refman/8.0/en/nested-join-optimization.html ; https://dev.mysql.com/doc/workbench/en/wb-relationship-tools.html