Requête SQL complexe

Signaler
Messages postés
32
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
13 septembre 2004
-
Messages postés
152
Date d'inscription
jeudi 10 avril 2003
Statut
Membre
Dernière intervention
18 novembre 2004
-
Je souhaiterais intégrer un systeme de votes sur mon site, une page où l'on peut attribuer une note en fonction d'une photo, lorsqu'une photo est notée, la page suivante en affiche une autre pas encore notée.
Mais mon problème se situe au niveau de la requête vers mysql :
En effet je fais une jointure entre deux tables avec un LEFT JOIN sur la table des votes, elle va chercher une photo qui n'a pas encore été notée par le membre.
Mais lorsque le membre a voté pour beaucoup de photos, la requête met un temps fou pour s'executer car elle cherche l'ensemble des photos déjà notées dans la table 'vote' pour les exclure du résultat.
Donc le temps d'execution augmente en fonction du nombre de votes effectués par le membre.
Ma question est :
Y'a t'il une solution qui permet un scanne plus rapide de la table mysql ou avec des tables temporaires ou autres..., donc une solution viable à long terme.
Merci.

5 réponses

Messages postés
152
Date d'inscription
jeudi 10 avril 2003
Statut
Membre
Dernière intervention
18 novembre 2004

Il faudrait la structure de tes deux tables, y compris les index , et ta requête afin que l'on puisse essayer de répondre correctement.
Le nombre de lignes de chaque table serait aussi intéressant...
Messages postés
32
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
13 septembre 2004

la table où sont enregistré les votes :

CREATE TABLE `votes` (
`id` int(10) unsigned NOT NULL auto_increment,
`id_votant` int(11) unsigned NOT NULL default '0',
`id_photo_concernee` int(11) unsigned NOT NULL default '0',
`note_attribuee` int(10) unsigned NOT NULL default '0',
`date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `id_2` (`id`),
KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=15844 ;

La table où sont enregistré les photos :

CREATE TABLE `photos` (
`id_photo` int(11) unsigned NOT NULL auto_increment,
`id_proprio` int(10) unsigned NOT NULL default '0',
`comment` text NOT NULL,
`date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id_photo`)
) TYPE=MyISAM AUTO_INCREMENT=1197 ;

La requête :

$req = "SELECT a.id_photo,a.id_proprio FROM photos a LEFT JOIN votes b ON b.id_votant='".$_SESSION['id_membre']."' AND b.id_photo_concernee=a.id_photo WHERE b.id_photo_concernee IS NULL AND a.valide='TRUE' AND a.id_proprio!='".$_SESSION['id_membre']."' ORDER BY RAND() LIMIT 1";

Voilà j'espére que ça pourra t'aider à trouver une réponse.
Messages postés
152
Date d'inscription
jeudi 10 avril 2003
Statut
Membre
Dernière intervention
18 novembre 2004

Je n'ais pas trop de temps pour chercher, mais je pense qu'en ajoutant un index sur le champ id_votant de la table votes devrait améliorer les perfs.
Envisager aussi un index sur le champ id_photo-concernée

Tout ceci est assez facile à tester car on n'intervient que sur les tables et pas sur le code.

Si cela est efficace, merci de nous le faire savoir...
Messages postés
32
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
13 septembre 2004

Tu m'as sauvé la vie ! lol
ça marche à la perfection !!!
Je n'y connais strictement rien au niveau de l'indexation des champs et je n'aurais jamais imaginé leur importance...
Merci bcp !
Messages postés
152
Date d'inscription
jeudi 10 avril 2003
Statut
Membre
Dernière intervention
18 novembre 2004

L'index ne contient que le champ concerné et éventuellemnt des pointeurs. Sa taille est infiniment plus petite que celle de la table, et on comprend donc aisément qu'un scan de l'index et plus rapide qu'un scan de la table.

Ceci dit, attention à l'excès d'index, il peuvent nottament ralentir les traitements de mise à jour.....