2012-11-29 5 views
0

J'ai fait la requête suivante basée sur de nombreux tutoriels de blogs et des réponses sur stackoverflow.MySQL: simplifier une requête complexe

$query = mysql_query("SELECT COUNT(user_id) FROM $table f1". 
"WHERE (user_id = '$userA')". 
"AND EXISTS (SELECT 1 FROM $table f2 WHERE user_id = '$userB'" 
"AND f1.$field = f2.$field)") 

or die(mysql_error()); 
while($row = mysql_fetch_array($query)){ 
    $com = $row['COUNT(user_id)']; 
} 

Les paramètres tels que userA, userB sont pris par un tableau à une dimension de 4000 valeurs. Mais en fait, j'utilise la boucle à l'intérieur de la boucle pour faire une table de taille 4000x4000.

En raison des nombreuses données dans la base de données, le nombre total d'interrogations iraniennes sera de 17.000.000. J'ai donc essayé d'exécuter le script complet mais j'ai vu que la requête ci-dessus prenait plusieurs secondes (1 ou 2).

Avez-vous une suggestion pour augmenter la vitesse d'exécution en corrigeant la requête ci-dessus?

Répondre

2

Je pense que vous pouvez utiliser une requête INNER JOIN comme ci-dessous:

SELECT COUNT(f1.user_id) 
FROM $table f1 JOIN $table f2 
    ON f1.$field = f2.$field 
WHERE f1.user_id = '$userA' 
    AND f2.user_id = '$userB' 
+0

OMG! C'est vraiment rapide maintenant! (30 par seconde au lieu de 1 par seconde!) – zuperakos

+1

@zuperakos Les sous-sélections sont mal optimisées dans mysql. Évitez-les quand c'est possible. – jordanm

+0

Merci beaucoup à tous les deux! – zuperakos