dadybond
Messages postés32Date d'inscriptionmercredi 26 novembre 2003StatutMembreDernière intervention13 septembre 2004
-
21 juin 2004 à 01:08
phpwankenobi
Messages postés152Date d'inscriptionjeudi 10 avril 2003StatutMembreDernière intervention18 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.
phpwankenobi
Messages postés152Date d'inscriptionjeudi 10 avril 2003StatutMembreDernière intervention18 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...
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.
phpwankenobi
Messages postés152Date d'inscriptionjeudi 10 avril 2003StatutMembreDernière intervention18 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...
dadybond
Messages postés32Date d'inscriptionmercredi 26 novembre 2003StatutMembreDernière intervention13 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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
phpwankenobi
Messages postés152Date d'inscriptionjeudi 10 avril 2003StatutMembreDernière intervention18 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.....