Wyciągnięcie danych z 3 tabel jednocześnie - wydajność

0

Witam.

Posiadam 3 tabele w bazie:

  • movies - tutaj są zapisane wszystkie informacje o filmach jakie posiadam (najważniejsza kolumna - movie_id),
  • species - tutaj są gatunki danego filmu, np. film może być horrorem, dramatem i akcją (movie_id jest łączone z species_id),
  • types - tutaj są typy danego filmu, np. film może być czytany, z lektorem itp. (movie_id jest łączone z type_id).

Moje zapytanie:

SELECT m.*, t.*, s.* FROM `zz_movies` m LEFT JOIN `zz_species` s ON m.movie_id = s.movie_id  LEFT JOIN `zz_types` t ON m.movie_id = t.movie_id GROUP BY m.movie_id ORDER BY m.movie_added DESC LIMIT 20

W samej tabeli z filmami (movies) jest ponad 13200 rekordów, pozostałe dwie tabele są jeszcze bardziej obszerne.
Efektem tego zapytania jest ~20 sekundowe oczekiwanie na zwrot odpowiedzi z bazy danych. To jest oczywiście nie do przyjęcia. Pytanie - jak to rozbić? Najpierw wyciągać same ID filmów, a potem w pętli while() kolejne zapytanie, wyciągające gatunek i typ filmu czy jak to rozwiązać?

Dzięki.

0

Na oko problem stanowi to sortowanie a nie odczyt danych. Zobacz ile zajmie sam select bez sortowania ;) jeśli typ faktycznie będzie problem to załóż indeks na to pole.

0

Ja bym zaczął od znormalizowania tej bazy.

1

Jak to baza danych, MySQL? Bo raczej na pewno nie jest to MS SQL Server.
Po co jest ten group by w tym zapytaniu? Przecież to nic nie daje, bo:

  1. Jeżeli każdy film posiada przypisany dokładnie jeden gatunek i jeden typ, to po co grupować?
  2. Jeżeli każdy film posiada wiele przypisań do gatunków lub typów, to i tak Twoje group by spowoduje, że zostanie wybrany jakiś tam losowy wiersz ("urok" MySQL) o gatunku i typie. Czyli chyba bez sensu.
    Rozumiem, że indeksy na polach movie_id (tu pewnie tak, bo to pewnie PrimaryKey) i movie_added istnieją?
    Poza tym w przypadku movie_added powinien być indeks descending, gdyby tylko taki był zaimplementowany w MySQL. A nie jest, czyli to sortowanie pewnie jest mocno kosztowne. Ale wiesz, zawsze możesz sortować rosnąco i wypluwać dane od końca ;-) Tak czy inaczej, spróbuj usunąć ów DESC z order by i sprawdź jak to działa.

Ilości wierszy które podałeś są raczej małe i zapytanie powinno się wykonywać błyskawicznie. I może się nawet wykonuje, tyle że wykonujesz je na zdalnym serwerze i 99% czasu jest zabrane przez przesłanie danych z serwera do Twojego komputera? Nie wiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1