accélérer une requete mysql

Petit nouveau ! | 2 Messages

22 mai 2006, 15:25

Bonjour à tous !

J'affiche sur mon site une liste de sujets (dans un forum que j'ai créé afin qu'il répondre à certains critères)...

Pour chaque sujet, j'affiche un sigle pour renseigner l'utilisateur enregistré s'il y a un nouveau message ou pas.

Pour ce faire, je fais deux requêtes sql :

SELECT * FROM forums_titres

et juste en-dessous, je fais (uniquement si l'utilisateur est enregistré et où $id_profil = son id)

SELECT COUNT(*) FROM forums_newmessage WHERE id_profil='$id_profil' AND id_titre='$r[id_titre]'

Si le résultat du count est + grand que 0, automatiquement il y a un nouveau message et donc l'affichage du sigle...

Le problème étant que ca prend beaucoup beaucoup trop de temps et je ne sais pas comment optimiser cette requête...

Si quelqu'un peut m'aider...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 mai 2006, 15:58

Le problème est si j'ai bien compris, que tu fais le count pour chaque sujet affiché, et donc s'il y a 30 sujets, cela implique 30 count.. tu pourrais pour optimiser cela faire un count sans tenir compte du sujet (et ainsi ramener en une seule requête la valeur pour tous les enregistrements) que tu mettrais dans un tableau qui sera plus rapide à interroger. Tu aurais ainsi un tableau du genre

$tab = array ( idSujet => nbMessages), que tu pourrais intérroger en appellant $tab[$idSujet] pour obtenir le nombre de message associé...

Option 2, faire une jointure dans ta requête pour rammener à la fois sujet et nombre de réponses associés. Quelque chose du genre
$sql = " SELECT ... 
FROM forums_titres ft
OUTER JOIN forums_newmessage fm ON ft.id_titre = fm.id_titre
WHERE fm.id_profil = " . $id_profil;
Sinon histoire d'améliorer légèrement les performances, tu peux :
- virer les apostrophes autour des nombres dans tes chaines SQL : il les considère comme des chaines de caractère et est obligé de les convertir en nombre pour les comparer en base.. ca lui fera toujours ça de moins à faire
- lister explicitement les champs que tu récupères dans ton select (au lieu du "select *", tu ne rammenes ainsi que ceux que tu utilises, et pour certains code ou l'ordre des champs est important, c'est une bonne habitude à prendre que de les lister.
- ajouter des index, si ce n'est pas déjà fait, sur les colonnes utilisées dans ton WHERE, une table indexée est lu beaucoup plus rapidement puisqu'il n'a pas à parcourir toute la table à chaque fois.

Petit nouveau ! | 2 Messages

22 mai 2006, 16:10

Merci pour le count unique...

Concernant le reste, j'avais déjà testé (la jointure) mais le problème venait si personne n'était connecté (visiteur donc)...

et pour le reste, je liste déjà mais pour ici, je ne l'avais pas recopié tout comme les index qui sont déjà mis...

vais tester le tableau...