2013-12-10 11 views
5

को बदलने और अनुकूलित करने के लिए मुझे इन एसक्यूएल क्वेरी को आईएन के साथ उप-क्वेरी का उपयोग न करने की आवश्यकता है, मुझे इस क्वेरी को तेज़ी से काम करने की आवश्यकता है।एसक्यूएल क्वेरी

यहां क्वेरी है जिस पर मैं काम कर रहा हूं। लगभग 7 मिलियन पंक्तियां

SELECT `MovieID`, COUNT(*) AS `Count` 
FROM `download` 
WHERE `UserID` IN (
SELECT `UserID` FROM `download` 
    WHERE `MovieID` = 995 
) 
GROUP BY `MovieID` 
ORDER BY `Count` DESC 

धन्यवाद

उत्तर

7

कुछ इस तरह है - लेकिन सुनिश्चित करें कि आप सही काम गिनती कर रहे हैं बनाने के (घटना है कि आप एक बाहरी करने के लिए स्विच में शामिल हों में) ...

SELECT MovieID 
     , COUNT(*) ttl 
    FROM download x 
    JOIN download y 
    ON y.userid = x.userid 
    AND y.movieid = 995 
    GROUP 
    BY x.MovieID 
    ORDER 
    BY ttl DESC; 
+2

मैंने आपके इतिहास से कई प्रश्न और ओपी के साथ बहुत से लक्ष्य को देखा है। केवल दोष, शायद भविष्य के लिए, उपयोगकर्ता के लिए विस्तार करें ताकि वे समझ सकें कि चीजें एक निश्चित तरीके से क्यों काम करती हैं, उन्हें और दूसरों की मदद मिलेगी ताकि वे सीख सकें कि भविष्य में कैसे कटौती/पेस्ट कर सकते हैं ... बस रचनात्मक आलोचना, लेकिन फिर, आप पदों के साथ लक्ष्य पर हैं। – DRapp

+0

हाँ, उचित टिप्पणी। – Strawberry

-2

फिल्टर movieId..you पर प्रत्यक्ष उप क्वेरी जोड़ने की जरूरत नहीं है। यह मूवीआईडी ​​= 995 का उपयोग करके खंड में किया जा सकता है।

SELECT `MovieID`, COUNT(*) AS `Count` 
FROM `download` 
WHERE `MovieID` = 995 
GROUP BY `MovieID` 
ORDER BY `Count` DESC 
+1

इस मूल प्रश्न के बराबर नहीं है। वह किसी भी उपयोगकर्ता की सभी फिल्में मांगता है जिसने एक दी गई फिल्म डाउनलोड की है। – YXD

+0

क्यों? यह सही है –

+0

इस क्वेरी में परिणाम सेट में केवल एक मूवीआईडी ​​(995) होगा। मूल क्वेरी में यह नहीं हो रहा है। – YXD

0

उपयोग Exists बजाय, Optimizing Subqueries with EXISTS Strategy देखें:

में outer_expr (से ... inner_expr का चयन करें जहां subquery_where) MySQL बाहर से करने के लिए "का मूल्यांकन करता है प्रश्न:

निम्नलिखित सबक्वेरी तुलना पर विचार करें अंदर। "यही है, यह पहले बाहरी अभिव्यक्ति outer_expr का मान प्राप्त करता है, और फिर सबक्वायरी चलाता है और जो पंक्तियां उत्पन्न करता है उसे कैप्चर करता है।

एक बहुत उपयोगी अनुकूलन सबकुरी को "सूचित" करना है कि केवल ब्याज की पंक्तियां हैं, जहां आंतरिक अभिव्यक्ति inner_expr outer_expr के बराबर है। यह सबक्वायरी WHERE क्लॉज में उपयुक्त समानता को दबाकर किया जाता है। यही कारण है, तुलना इस में बदल जाती है:

मौजूद है (का चयन करें 1 से ... कहां subquery_where और outer_expr = inner_expr) रूपांतरण के बाद, MySQL पंक्तियों की संख्या सीमित करने के लिए धक्का दिया डाउन समानता का उपयोग कर सकते यह सबक्वायरी का मूल्यांकन करते समय की जांच करनी चाहिए।

+0

क्या आप क्वेरी लिखकर इसे समझा सकते हैं। यह अभी भी मेरे लिए बहुत भ्रमित है –

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