2013-12-10 26 views
5

Potrzebuję proszę zmienić to zapytanie SQL, aby NIE używać pod-zapytania z IN, potrzebuję, aby to zapytanie działało szybciej.Zmiana i optymalizacja zapytania sql

oto zapytanie, nad którym pracuję. Około 7 milionów wierszy.

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

Dzięki

Odpowiedz

7

Coś takiego - ale (w przypadku przełączeniu na outer join) Upewnij się liczysz słusznie ...

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

Widziałem wiele pytań z twojej historii i dość celnych z OP. Jedyną wadą, być może na przyszłość, jest rozszerzenie na użytkownika, aby zrozumieli DLACZEGO rzeczy działają w określony sposób, pomoże im i innym, aby nauczyli się, jak to robić w przyszłości, a po prostu kroją/wklejają ... Po prostu konstruktywna krytyka, ale znowu, ty są na cel dzięki postom. – DRapp

+0

Tak, uczciwy komentarz. – Strawberry

-2

filtr kierować na movieId..you nie trzeba dodawać zapytanie sub. można to zrobić za pomocą movieID = 995 w klauzuli where.

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

To nie jest równoznaczne z oryginalnego zapytania. Pyta o wszystkie filmy każdego użytkownika, który pobrał dany film. – YXD

+0

Dlaczego? To jest poprawne –

+0

To zapytanie będzie zawierać tylko jeden identyfikator MovieID (995) w zestawie wyników. To nie dzieje się w pierwotnym zapytaniu. – YXD

0

Zastosowanie Exists zamiast zobaczyć Optimizing Subqueries with EXISTS Strategy:

Rozważmy następujący podzapytaniu porównania:

outer_expr IN (SELECT FROM ... WHERE inner_expr subquery_where) MySQL ocenia zapytania „z zewnątrz wewnątrz. "Oznacza to, że najpierw uzyskuje on wartość zewnętrznego wyrażenia outer_expr, a następnie uruchamia podkwerendę i przechwytuje wiersze, które generuje.

Bardzo przydatną optymalizacją jest "informowanie" podzapytania, że ​​jedynymi interesującymi wierszami są te, w których wewnętrzne wyrażenie inner_expr jest równe outer_expr. Odbywa się to poprzez wciśnięcie odpowiedniej równości do klauzuli WHERE podzapytania. Oznacza to, że porównanie jest konwertowane do tego:

EXISTS (SELECT 1 FROM ... WHERE subquery_where I outer_expr = inner_expr) Po konwersji, MySQL można używać popychane w dół równości, aby ograniczyć liczbę wierszy musi przeanalizować podczas oceny podzapytania.

+0

możesz wyjaśnić to, pisząc zapytanie. Wciąż jest to dla mnie bardzo mylące –

Powiązane problemy