Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: JOIN na fragmencie
Forum PHP.pl > Forum > Bazy danych > MySQL
soomal
Wybieranie filmów podobnych na podstawie przypisanych im tagów.

tabela filmy:
film_id,adres,nazwa

tabela tag_film
film_id,tag_id

  1. SELECT DISTINCT filmy.film_id AS film_id,adres,nazwa
  2. FROM filmy INNER JOIN tag_film USING (film_id) WHERE tag_id IN (SELECT tag_id FROM tag_film WHERE film_id='.$film_id.')


Działa. Problem jest taki, że działa bardzo wolno.
Prawdopodobna przyczyna: Najpierw wykonywany jest join na całej tabeli, dopiero później wybiera się z niej fragment z film_id równy podanemu w zmiennej.

Jak można zoptymalizować to zapytanie?
sticker
dodaj na początku zapytania explain i pokaż co pokazało to może coś zaradzimy winksmiley.jpg

btw. nie uważasz że to film_id AS film_id jest bez sensu snitch.gif

WHERE tag_id IN (SELECT tag_id FROM tag_film WHERE film_id='.$film_id.') nie łatwiej where film_id='.$film_id.' ?
soomal
  1. 1 PRIMARY tag_film ALL
  2. 1 PRIMARY filmy eq_ref PRIMARY PRIMARY 4 soomal_baza.tag_film.film_id 1
  3. 2 DEPENDENT SUBQUERY tag_film ALL


Coś takiego dało EXPLAIN.

Cytat
WHERE tag_id IN (SELECT tag_id FROM tag_film WHERE film_id='.$film_id.') nie łatwiej where film_id='.$film_id.'


where film_id=.'$film_id.' miało by zastąpić cały ten fragment? Nie sądziłem, że to tak może zadziałać.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.