Requête SQL complexe

dadybond Messages postés 32 Date d'inscription mercredi 26 novembre 2003 Statut Membre Dernière intervention 13 septembre 2004 - 21 juin 2004 à 01:08
phpwankenobi Messages postés 152 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 18 novembre 2004 - 22 juin 2004 à 15:56
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

phpwankenobi Messages postés 152 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 18 novembre 2004
21 juin 2004 à 12:12
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...
0
dadybond Messages postés 32 Date d'inscription mercredi 26 novembre 2003 Statut Membre Dernière intervention 13 septembre 2004
21 juin 2004 à 12:53
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.
0
phpwankenobi Messages postés 152 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 18 novembre 2004
22 juin 2004 à 12:24
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...
0
dadybond Messages postés 32 Date d'inscription mercredi 26 novembre 2003 Statut Membre Dernière intervention 13 septembre 2004
22 juin 2004 à 13:35
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
phpwankenobi Messages postés 152 Date d'inscription jeudi 10 avril 2003 Statut Membre Dernière intervention 18 novembre 2004
22 juin 2004 à 15:56
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.....
0
Rejoignez-nous