2012-08-08 14 views
12

निम्न क्वेरी में:WHERE क्लॉज में उपयोग किए जाने पर MySQL द्वारा कैश किए गए सबक्वायरीज़ हैं?

SELECT column_a, column_b FROM table_a WHERE 
    column_b IN (SELECT b_id FROM table_b) 

सबक्वेरी SELECT b_id FROM table_b एसक्यूएल पार्सर द्वारा कैश है, या यह (उदाहरण के लिए, PHP में) पहले से क्वेरी करने के लिए, एक चर के रूप में सहेज तेजी से हो सकता है, और उसके बाद उन मानों को एक CSV स्ट्रिंग के रूप में पास करें?

उदा।

EXPLAIN EXTENDED का उपयोग कर पूरी तरह से प्रभाव सबक्वेरी पर निपटा वर्णन करने के लिए में
SELECT column_a, column_b FROM table_a WHERE 
    column_b IN (1,3,4,6,8,10,16,18) 
+0

एक सबक्वायरी के साथ 'IN' का उपयोग करना एक भयानक विचार है। आप यहां आने वाले परिणामों को प्राप्त करने से बेहतर हैं, क्योंकि क्वेरी अनिवार्य रूप से एक इक्विटी-जॉइन है। 'स्तंभ_ए चुनें, table_a से कॉल__बी table_b में शामिल हों column_b = b_id' –

+0

@TimSeguine: यह एक भयानक विचार क्यों है? यदि 'table_b' एन: एम रिलेशन टेबल है, तो 'जॉइन' का उपयोग होने पर 'table_a' से कई पंक्तियां मिलेंगी। यह अवांछित हो सकता है। – naitsirch

+1

@naitsirch यह एक बुरा विचार है क्योंकि MySQL पर निर्भर उप-सामानों के लिए खराब समर्थन है। यदि आप किसी भी तरह से उनसे बच सकते हैं, तो आपको शायद चाहिए। एक अच्छी तरह से चुने गए 'ग्रुप बाय' ज्यादातर समय के बाहरी परिणामों को समाप्त करता है। –

उत्तर

6

देखो।

उदाहरण के लिए:

EXPLAIN EXTENDED 
SELECT column_a, column_b FROM table_a WHERE 
    column_b IN (SELECT b_id FROM table_b) 

वे कैशिंग आप चाहें परिणाम नहीं है, तो आप उन्हें भंडारण में रुचि हो सकती है या तो स्मृति (memcache, redis) में, फ़ाइल पर (PHP file libraries का प्रयोग करके) या एक में अलग एसक्यूएल कैश खुद।

+11

यह आज मैंने देखा है कि यह सबसे गलत जवाब है। –

+1

@ ypercubeᵀᴹ और जो भी इसे ऊपर उठाया गया है, क्या आप व्याख्या कर सकते हैं या वैकल्पिक उत्तर प्रदान कर सकते हैं? – Secret

संबंधित मुद्दे