Aller au contenu

Sujets conseillés

Posté

Bonjour à tous,

Je vous contacte une nouvelle fois pour un petit problème que je n'arrive pas à régler. J'utilise cette requête pour calculer le nombre de pages pour un affichage de données. Cette requête est très longue (environ 20 secondes à s'effectuer). J'ai même essayé avec "mysql_fetch_assoc" et "mysql_fetch_array" mais rien n'y fait. Je ne comprend pas pourquoi cette requête est aussi longue alors qu'utilisée dans un WHILE elle passe très vite.... Si quelqu'un pouvait m'aider, se serait sympa. Merci d'avance ! :thumbsup:

$retour = mysql_query("SELECT COUNT(*) AS nb_messages FROM table_1 WHERE createur != '$createur' AND reference NOT IN (SELECT reference FROM  table_2 WHERE trouveur = '$createur')");

$donnees = mysql_fetch_assoc($retour);$totalDesMessages = $donnees['nb_messages'];
// On calcule le nombre de pages à créer
$nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);

Posté

En fait, c'est Mysql qui n'est pas performant quand tu utilises une requête dans le NOT IN.

Pour palier a ce problème, au boulot, c'est un des rares cas ou l'on préfère faire cette requete en 2 temps :

- Tu fais la requete du not in, et ensuite, tu remplaces ta requete par sa liste de resultats.

Posté

Merci beaucoup Dadou de ta réponse !

J'ai donc essayé ceci :

$ql = "SELECT COUNT(reference) AS nb_messages FROM table_1 WHERE createur != '$createur' AND reference NOT IN (SELECT reference FROM table_2 WHERE trouveur = '$createur')";

$retour = mysql_query($ql);

$donnees = mysql_fetch_assoc($retour);

Mais malheureusement je n'ai rien gagné en vitesse. Apparemment mon choix du NOT IN n'est pas terrible. Il faudrait que je fasse une jointure mais comme je n'en ai jamais fais, je veux bien un peu de lumière... Merci d'avance !

Posté

Il n'y a aucune différence entre cette requête et la précédente. Ce que te conseillait Dadou, c'est de faire le sub-select (le SELECT dans les parenthèses du NOT IN), récupérer les résultats, puis construire une deuxième requête en mettant la liste des references à exclure directement dans la requête. Bref, il y a deux requêtes, dont l'une est composée avec les résultats de la première.

Sinon tu peux essayer ça:

SELECT count(reference) AS nb_messages FROM (SELECT reference FROM table_1 WHERE createur != '$createur' EXCEPT SELECT reference FROM table_2 WHERE trouveur = '$createur') s

Dans tous les cas, la présence d'un index sur table_2.trouveur pourrait beaucoup aider.

Evidemment, on suppose que ton utilisateur de $createur directement dans la requête est un raccourci pour simplifier ton post, ou alors que tu vérifies de façon très stricte la valeur de $createur, sinon tu cours le risque d'une injection SQL. Tu devrais TOUJOURS utiliser mysql_real_escape_string, ou PDO pour éviter ce genre de problèmes.

Jacques.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...