2010-09-25 9 views
0

En supposant que j'ai 2 grandes tables avec plus de 10 millions de rangées dans chaque table.Large Mysql Join

Le Tableau 1 est une table Movie avec un ID utilisateur indiquant que l'utilisateur a vu ce film, et le Tableau 2 est un tableau de Musique avec un ID utilisateur indiquant le troupeau utilisateur de cette chanson. Ce que je veux faire est de pouvoir lancer une requête quand l'utilisateur veut savoir s'il y a un morceau avec le même nom qu'un film qu'il a vu.

Par exemple.

SELECT movies.name FROM movies, music WHERE movies.name = music.name and movies.userID = '8a80828c2b46d717012b4801d2650002'; 

J'ai indexé le nom du film et le nom de la musique dans les deux tableaux. Le problème est que lorsque l'utilisateur appelle la requête, il semble que ce serait lent en fonction du nombre de lignes présentes dans les tables et du nombre de films/musiques que l'utilisateur a regardé.

Supposons que l'utilisateur a regardé 9000 films et 90k chansons. Comment pourrais-je optimiser cette requête pour qu'elle soit rapide (moins de 15 secondes maximum)?

EDIT: Serait-il logique pour moi d'utiliser Triggers après chaque film regardé pour vérifier s'il y a un morceau qui existe et mettre à jour une troisième table avec userID, movieID, musicID? Le volume élevé d'insertions dans la base de données entraînerait-il un ralentissement des déclencheurs, ce qui à son tour affecterait les performances de la base de données? Pourquoi ne pas créer un index sur le film userid?

Répondre

1
select name from songs where name in (select name from movies where userid=5); 

OU

select s.name from songs s 
join (select name from movies where userid=5) as m 
on s.name = m.name; 
  • Gardez un index sur userid dans les films
  • Gardez un index sur le nom dans les chansons
0

Comme il est dans votre clause WHERE, il devrait fonctionner plus vite.

+0

Hey Benoit, merci pour la réponse rapide. Comment ajouter un index sur l'aide de film userID? –

+0

Les index sont utiles pour filtrer les lignes d'une table. Ici vous filtrez la table MOVIE sur le contenu de la colonne UserID. – Benoit

0

Utilisez des clés entières, pas des chaînes; déplacez également le userId (entier maintenant) vérifiez avant la vérification de comparaison de chaîne.