मेरे पास foo
(20 अन्य लोगों के बीच) कॉलम bar
, baz
और quux
baz
और quux
पर इंडेक्स के साथ एक तालिका है। तालिका में ~ 500k पंक्तियां हैं।MAX() 100 गुना आदेश से धीमा क्यों है ... LIMIT 1?
प्रश्नों के लिए निम्नलिखित गति इतनी भिन्न क्यों है? क्वेरी ए 0.3 लेता है, जबकि क्वेरी बी 28s लेता है।
क्वेरी एक
select baz from foo
where bar = :bar
and quux = (select quux from foo where bar = :bar order by quux desc limit 1)
के बारे में बताएं
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY foo ref quuxIdx quuxIdx 9 const 2 "Using where"
2 SUBQUERY foo index NULL quuxIdx 9 NULL 1 "Using where"
क्वेरी बी
select baz from foo
where bar = :bar
and quux = (select MAX(quux) from foo where bar = :bar)
के बारे में बताएं
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY foo ref quuxIdx quuxIdx 9 const 2 "Using where"
2 SUBQUERY foo ALL NULL NULL NULL NULL 448060 "Using where"
मैं MySQL 5.1.34 का उपयोग करें।
'लीमिट 1' का मतलब है 1 पंक्ति लेना और रोकना, है ना?क्वेरी बी ओ (एन * एम) – jondinham
@PaulDinh लगता है कि दोनों प्रश्न एक ही परिणाम बनाते हैं, संभवतः यह संचालन के क्रम से संबंधित है, पहले मामले में यह दूसरी क्वेरी में परिणाम (तेजी से) से quux और खोज बार द्वारा सॉर्ट किया जाता है। खोज बार (पूरी तालिका की जांच करने की आवश्यकता है) को बिना छेड़छाड़ से और फिर अधिकतम –
@ विकटर ढूंढने के लिए सॉर्ट करें, क्या आप दिखा सकते हैं कि आप foo से चुनिंदा बाज़ समझाएं, जहां बार =: बार और quux = (foo से quux चुनें जहां quux = MAX (quux) और bar =: bar) ' 'foo से चुनें baz समझाएं जहां बार =: बार और quux = (foo से quux का चयन करें जहां quux = MAX (quux) और bar =: bar limit 1)' –