मैं उत्सुक हूं कि EXISTS()
का निष्पादन IN()
से तेज़ होना चाहिए।MySQL मौजूदा बनाम बनाम subquery बनाम subquery बनाम?
मैं answering a question था जब बिल करविन ने एक अच्छा बिंदु लाया। जब आप EXISTS()
का उपयोग करते हैं तो यह एक सहसंबंधित सबक्वायरी (आश्रित सबक्वायरी) का उपयोग कर रहा है और IN() केवल एक सबक्वायरी का उपयोग कर रहा है।
शो कि EXISTS
और NOT EXISTS
दोनों एक आश्रित सबक्वेरी और IN/NOT IN
दोनों सिर्फ एक सबक्वेरी का उपयोग का उपयोग व्याख्या .. इसलिए मैं उत्सुक कैसे एक सहसंबद्ध सबक्वेरी एक सबक्वेरी की तुलना में तेजी है कर रहा हूँ ??
मैंने पहले EXISTS का उपयोग किया है और यह IN से तेज़ी से निष्पादित करता है, इसलिए मैं उलझन में हूं।
यहाँ के साथ एक SQLFIDDLE, कैसे करता है मौजूद है बताते
EXPLAIN SELECT COUNT(t1.table1_id)
FROM table1 t1
WHERE EXISTS
( SELECT 1
FROM table2 t2
WHERE t2.table1_id <=> t1.table1_id
);
+-------+-----------------------+-----------+-------+---------------+-----------+--------+--------------------------+--------+------------------------------+
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY |KEY_LEN | REF | ROWS | EXTRA |
+-------+-----------------------+-----------+-------+---------------+-----------+--------+--------------------------+--------+------------------------------+
| 1 | PRIMARY | t1 | index | (null) | PRIMARY | 4 | (null) | 4 | Using where; Using index |
| 2 | DEPENDENT SUBQUERY | t2 | REF | table1_id | table1_id| 4 | db_9_15987.t1.table1_id | 1 | Using where; Using index |
+-------+-----------------------+-----------+-------+---------------+-----------+--------+--------------------------+--------+------------------------------+
EXPLAIN SELECT COUNT(t1.table1_id)
FROM table1 t1
WHERE NOT EXISTS
( SELECT 1
FROM table2 t2
WHERE t2.table1_id = t1.table1_id
);
+-------+-----------------------+-----------+-------+---------------+-----------+--------+--------------------------+--------+------------------------------+
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY |KEY_LEN | REF | ROWS | EXTRA |
+-------+-----------------------+-----------+-------+---------------+-----------+--------+--------------------------+--------+------------------------------+
| 1 | PRIMARY | t1 | index | (null) | PRIMARY | 4 | (null) | 4 | Using where; Using index |
| 2 | DEPENDENT SUBQUERY | t2 | ref | table1_id | table1_id| 4 | db_9_15987.t1.table1_id | 1 | Using index |
+-------+-----------------------+-----------+-------+---------------+-----------+--------+--------------------------+--------+------------------------------+
EXPLAIN SELECT COUNT(t1.table1_id)
FROM table1 t1
WHERE t1.table1_id NOT IN
( SELECT t2.table1_id
FROM table2 t2
);
+-------+-------------------+-----------+-------+---------------+-----------+--------+----------+--------+------------------------------+
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY |KEY_LEN | REF | ROWS | EXTRA |
+-------+-------------------+-----------+-------+---------------+-----------+--------+----------+--------+------------------------------+
| 1 | PRIMARY | t1 | index | (null) | PRIMARY | 4 | (null) | 4 | Using where; Using index |
| 2 | SUBQUERY | t2 | index | (null) | table1_id| 4 | (null) | 2 | Using index |
+-------+-------------------+-----------+-------+---------------+-----------+--------+----------+--------+------------------------------+
कुछ सवाल
ऊपर बताते हैं में using where
औरहै अतिरिक्त मेंलेकिन EXISTS के पास अतिरिक्त में using where
नहीं है?
एक सहसंबंधित उपक्वायर उपखंड से तेज़ कैसे होता है?
तो क्या आपके पास 'अस्तित्व 'का एक रेपो तेजी से निष्पादित है? इसके अलावा आप किस संस्करण पर अनुभव करते थे? 'इन' भी [एक ही समस्या का उपयोग किया जाता था] (http://stackoverflow.com/q/3416076/73226) –
@ मार्टिनस्मिथ अच्छी तरह से मैंने एक साल पहले अपने प्रश्नों को IN से EXISTS में बदल दिया क्योंकि उन्हें EXISTS के साथ तेजी से निष्पादित किया गया था (पूरी तरह से कुछ सेकंड की तरह कुछ सेकंड की तरह नहीं) .. लेकिन मुझे अभी एक नया कंप्यूटर मिला है और MySQL का नवीनतम संस्करण डाउनलोड किया गया है .. मैंने अभी एक प्रश्न चलाया और IN0000 सेकंड तक तेजी से भाग गया ... हाल ही में निष्पादन योजना/अनुकूलक के लिए एक फिक्स किया गया है? –
मुझे माईएसक्ल ऑप्टिमाइज़र के बारे में बहुत कुछ नहीं पता लेकिन मुझे विश्वास है कि 5.6 ने कुछ बदलाव किए हैं। https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization।एचटीएमएल –