Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

क्या मैं MySQL को पहले सबक्वायरी करने के लिए मजबूर कर सकता हूं?

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 का उपयोग करके किया जाएगा ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. प्रश्नों में mysql केस संवेदनशील तालिका नाम

  2. MySQL क्वेरी में IF ELSE स्टेटमेंट कैसे लिखें?

  3. Jquery-select2 के साथ गतिशील निर्भर ड्रॉपडाउन

  4. SSH सुरंग पर MySQL कनेक्शन

  5. NodeJS, mysql कनेक्शन बंद नहीं करता है