mysql - STRAIGHT_JOIN इस क्वेरी को इतनी भारी रूप से क्यों सुधारता है, और चयन कीवर्ड के बाद लिखा जाने पर इसका क्या अर्थ है?



(1)

मेरे पास निम्न MySQL क्वेरी है:

select t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

इसे चलाने में लगभग 30 सेकंड लगते हैं, जो अजीब था, क्योंकि अगर मैं शामिल होने पर टिप्पणी करता हूं या कहां से एक सेकंड से कम लेता है: यानी

select t1.*
from Table1 t1
where t1.FilterID = 1

या

select t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID

प्रत्येक एक सेकंड से भी कम लेते हैं।

फिर STRAIGHT_JOIN कीवर्ड है, जिसे मैं यहां एक संदर्भ पा सकता हूं: http://dev.mysql.com/doc/refman/5.0/en/join.html

STRAIGHT_JOIN जॉइन के समान है, सिवाय इसके कि बाएं टेबल हमेशा सही तालिका से पहले पढ़ा जाता है। इसका उपयोग उन (कुछ) मामलों के लिए किया जा सकता है जिनके लिए जुड़ने वाले ऑप्टिमाइज़र गलत क्रम में टेबल रखता है।

क्या? मैं लिख सकता हूँ:

select t1.*
from Table1 t1
STRAIGHT_JOIN  Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

और क्वेरी एक सेकंड से भी कम समय में निष्पादित होती है।

यहां तक ​​कि अजनबी, मैं लिख सकता हूँ:

select STRAIGHT_JOIN  t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

और यह एक सेकंड से भी कम समय लेता है, और यह वाक्यविन्यास कानूनी भी प्रतीत नहीं होता है।

मुझे लगता है कि दूसरा उदाहरण यह है कि जब भी INNER जॉइन लिखा जाता है तब STRAIGHT_JOIN का उपयोग किया जाएगा, लेकिन मुझे इसके बारे में कोई दस्तावेज नहीं मिल रहा है।

यहां क्या हो रहा है, और "अनुकूलक में शामिल होने" का परिणाम ऐसे अपेक्षाकृत खराब प्रदर्शन में कैसे हो सकता है? क्या मुझे हमेशा STRAIGHT_JOIN का उपयोग करना चाहिए? मैं कैसे कह सकता हूं कि इसका उपयोग कब करें या नहीं?

तालिका 1 और तालिका 2 दोनों में प्राथमिक कुंजी पूर्णांक है; फ़िल्टरआईडी दूसरी तालिका के लिए एक विदेशी कुंजी है; कॉमन आईडी कॉलम दोनों तीसरे टेबल पर विदेशी कुंजी हैं। उनके दोनों पर इंडेक्स हैं। डेटाबेस इंजन InnoDB है।

धन्यवाद


यहां क्या हो रहा है, और "अनुकूलक में शामिल होने" का परिणाम ऐसे अपेक्षाकृत खराब प्रदर्शन में कैसे हो सकता है?

STRAIGHT_JOIN तालिकाओं के शामिल क्रम को मजबूर करता है, इसलिए table2 1 बाहरी लूप और table2 में आंतरिक लूप में स्कैन किया जाता है।

अनुकूलक सही नहीं है (हालांकि काफी सभ्य है), और सबसे संभावित कारण पुराना आंकड़ा है।

क्या मुझे हमेशा STRAIGHT_JOIN उपयोग करना चाहिए

नहीं, केवल जब अनुकूलक गलत है। यह हो सकता है कि आपका डेटा वितरण गंभीर रूप से खराब हो या ठीक से गणना नहीं की जा सके (कहें, स्थानिक या पूर्ण टेक्स्ट इंडेक्स के लिए)।

मैं कैसे कह सकता हूं कि इसका उपयोग कब करें या नहीं?

आपको आंकड़े एकत्र करना चाहिए, दोनों तरीकों के लिए योजनाएं बनाना चाहिए और समझना चाहिए कि इन योजनाओं का क्या अर्थ है।

यदि आप इसे देखते हैं:

  1. स्वचालित रूप से जेनरेट की गई योजना इष्टतम नहीं है और इसे मानक तरीकों से सुधार नहीं किया जा सकता है,

  2. STRAIGHT_JOIN संस्करण बेहतर है, आप समझते हैं कि यह हमेशा होगा और समझ जाएगा कि यह हमेशा क्यों होगा

, फिर STRAIGHT_JOIN उपयोग करें।





join