मैं {लोअरकेस "एक" के साथ शुरू नाम के साथ ग्राहकों} के सभी कर्मचारियों को पाने के लिए इस क्वेरी का उपयोग कर रहा में:MySQL - कैसे सूचकांक का उपयोग करने के जहां एक्स में (<subquery>)
SELECT * FROM employees
WHERE client_id IN (SELECT id FROM clients WHERE name LIKE 'a%')
कॉलम employees.client_id
एक है int, INDEX client_id (index_id)
के साथ। सबक्वायरी को IMHO आईडी-एस की एक सूची वापस करनी चाहिए, जिसका उपयोग WHERE क्लॉज में किया जाता है।
जब मैं EXPLAIN
क्वेरी करता हूं, तो प्राथमिक क्वेरी कोई अनुक्रमणिका (type:ALL
) का उपयोग नहीं करती है। लेकिन जब मैं EXPLAIN
सबक्वायरी (उदा। SELECT ... WHERE client_id IN (121,184,501)
) से ली गई एक सूची, EXPLAIN
type:range
पर स्विच करता है, और यह क्वेरी 50% तक तेज़ी से हो जाती है।
मैं क्वेरी को सबक्वायरी द्वारा लौटाए गए डेटा के लिए इंडेक्स का उपयोग कैसे कर सकता हूं - या, क्या इस डेटा को पुनर्प्राप्त करने का एक और अधिक प्रभावी तरीका है? (एप्लिकेशन सर्वर पर आईडी-सूची पुनर्प्राप्त करना, इसमें शामिल होना और दूसरी क्वेरी भेजना यहां और भी महंगा है)।
अग्रिम धन्यवाद।
इनर जॉइन सिंटैक्स का भी उपयोग कर सकता है। – MarkR
मैंने ऐसे मामलों को देखा है जहां क्वेरी ऑप्टिमाइज़र वास्तव में गलत हो जाता है, और आईडी को वापस करने के लिए एक सबक्वायरी तेज़ी से लोड हो जाती है। लेकिन यह वास्तव में एक विशिष्ट मामला था। देखें: http://www.benlumley.co.uk/2008/06/25/mysql-query-optimiser-left-lacking/ यदि आप विवरण में रूचि रखते हैं। – benlumley