SELECT `table_1`.*
FROM `table_1`
INNER JOIN
`table_2` [...]
INNER JOIN
`table_3` [...]
WHERE `table_1`.`id` IN
(
SELECT `id`
FROM [...]
)
AND [more conditions]
यदि आंतरिक तालिका को ठीक से अनुक्रमित किया गया है, तो यहां सबक्वायरी शब्द के सख्त अर्थों में "निष्पादित" नहीं किया जा रहा है।
चूंकि सबक्वेरी IN
. का एक भाग है अभिव्यक्ति, स्थिति को सबक्वेरी में धकेल दिया जाता है और इसे EXISTS
. में बदल दिया जाता है ।
वास्तव में, इस सबक्वेरी का मूल्यांकन प्रत्येक चरण पर किया जाता है:
EXISTS
(
SELECT NULL
FROM [...]
WHERE id = table1.id
)
आप वास्तव में इसे EXPLAIN EXTENDED
. द्वारा प्रदान किए गए विस्तृत विवरण में देख सकते हैं ।
इसलिए इसे DEPENDENT SUBQUERY
. कहा जाता है :प्रत्येक मूल्यांकन का परिणाम table1.id
. के मान पर निर्भर करता है . इस तरह की सबक्वेरी सहसंबद्ध नहीं है, यह अनुकूलित संस्करण है जो सहसंबद्ध है।
MySQL
हमेशा EXISTS
. का मूल्यांकन करता है अधिक सरल फिल्टर के बाद क्लॉज (क्योंकि उनका मूल्यांकन करना बहुत आसान है और इस बात की संभावना है कि सबक्वेरी का मूल्यांकन बिल्कुल नहीं किया जाएगा)।
यदि आप चाहते हैं कि सबक्वायरी का मूल्यांकन एक साथ किया जाए, तो क्वेरी को इस प्रकार फिर से लिखें:
SELECT table_1.*
FROM (
SELECT DISTINCT id
FROM [...]
) q
JOIN table_1
ON table_1.id = q.id
JOIN table_2
ON [...]
JOIN table_3
ON [...]
WHERE [more conditions]
यह सबक्वेरी को जॉइन में अग्रणी होने के लिए मजबूर करता है, जो कि table_1
की तुलना में सबक्वेरी छोटा होने पर अधिक कुशल है। , और table_1
. की तुलना में अगर सबक्वेरी बड़ी है तो कम कुशल ।
अगर [...].id
. पर कोई इंडेक्स है सबक्वेरी में उपयोग किया जाता है, सबक्वेरी एक INDEX FOR GROUP-BY
का उपयोग करके किया जाएगा ।