यहाँ एक परिदृश्य है जो अभी हाल ही में काम पर आया था।
तीन तालिकाओं पर विचार करें, ए, बी, सी।
ए में 3,000 पंक्तियाँ हैं; बी में 300,000,000 पंक्तियाँ हैं; और C की 2,000 पंक्तियाँ हैं।
विदेशी कुंजियों को परिभाषित किया गया है: बी (a_id), B (c_id)।
मान लीजिए कि आपके पास एक क्वेरी है जो इस तरह दिखती है:
select a.id, c.id
from a
join b on b.a_id = a.id
join c on c.id = b.c_id
मेरे अनुभव में, MySQL इस मामले में C -> B -> A जाना चुन सकता है। C, A और B से छोटा है, और वे सभी समान हैं।
परेशानी यह है कि MySQL आवश्यक रूप से (C.id और B.c_id) बनाम (A.id और B.a_id) के बीच के चौराहे के आकार को ध्यान में नहीं रखता है। यदि B और C के बीच जुड़ने से B जितनी पंक्तियाँ वापस आती हैं, तो यह बहुत खराब विकल्प है; यदि A से शुरू करने से B को A के रूप में कई पंक्तियों तक फ़िल्टर किया जाता, तो यह एक बेहतर विकल्प होता। straight_join
इस आदेश को इस तरह लागू करने के लिए इस्तेमाल किया जा सकता है:
select a.id, c.id
from a
straight_join b on b.a_id = a.id
join c on c.id = b.c_id
अब a
इससे पहले ज्वाइन करना होगा b
।
आम तौर पर आप अपने जोड़ों को एक क्रम में करना चाहते हैं जो परिणामी सेट में पंक्तियों की संख्या को कम करता है। तो एक छोटी तालिका से शुरू करना और इस तरह से जुड़ना कि परिणामी जुड़ाव भी छोटा होगा, आदर्श है। अगर एक छोटी सी मेज से शुरू किया जाए और एक बड़ी मेज से जोड़ दिया जाए तो चीजें नाशपाती के आकार की हो जाती हैं।
यह आँकड़े पर निर्भर है। यदि डेटा वितरण बदलता है, तो गणना बदल सकती है। यह भी शामिल तंत्र के कार्यान्वयन के विवरण पर निर्भर है।
सबसे खराब स्थिति जो मैंने MySQL के लिए देखी है कि सभी लेकिन आवश्यक straight_join
या आक्रामक इंडेक्स हिंटिंग ऐसे क्वेश्चन हैं जो लाइट फिल्टरिंग के साथ एक सख्त सॉर्ट क्रम में बहुत सारे डेटा पर paginate करते हैं। MySQL दृढ़ता से किसी भी फिल्टर के लिए अनुक्रमित का उपयोग करना पसंद करता है और प्रकार से जुड़ता है; यह समझ में आता है क्योंकि अधिकांश लोग पूरे डेटाबेस को क्रमबद्ध करने की कोशिश नहीं कर रहे हैं, बल्कि उन पंक्तियों का एक सीमित उपसमूह है जो क्वेरी के लिए उत्तरदायी हैं, और एक सीमित उपसमूह को छांटना पूरी तालिका को छानने की तुलना में बहुत तेज है, कोई फर्क नहीं पड़ता कि यह सॉर्ट किया गया है या नहीं नहीं। इस मामले में, तालिका में शामिल होने के तुरंत बाद सीधे जुड़ना, जिसमें अनुक्रमित कॉलम था जिसे मैं निश्चित चीजों पर सॉर्ट करना चाहता था।
straight_join
।