Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1183 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  requete sur deux tables à optimiser

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

requete sur deux tables à optimiser

n°1284439
jhac
Posté le 16-01-2006 à 13:18:28  profilanswer
 

bonjour,
 
je cherche à optimiser une requete sur deux tables :
 
1 . table manif ; table qui stocke des événements avec un champs ville "renseigné par le nom de la ville"  pour chaque événement
2. table villes : table qui stocke les villes de plusieurs régions  et pour chaque ville champs "pays/territoire"
 
 
 
si je fais  
 
$sql = "SELECT DISTINCT * FROM manif LEFT JOIN villes ON villes.nom_ville=manifestation.manifestation_ville ";
$sql .="WHERE (manifestation_date_debut >='2006/01/16' OR manifestation_date_fin >='2006/01/16') AND villes.ref_pays='3'";  
 
çà marche mais çà mouline .. car il doit comparer avec tous les noms de villes (5000)  
 
 
j'ai essayé de faire une pré requete sur la table villes pour extraire les villes concernéés par la reference pays :  
 
 
$sql = "SELECT nom_ville FROM villes ";
  $sql .= "WHERE ref_pays = ".$pays;
 
  $rs = mysql_query($sql);
  $villes_ok = array() ;  
   while ($rsc=mysql_fetch_object($rs))  
    {  
    $villes_ok[] = $rsc->nom_ville;  
 
    }  
 
et ensuite :  
 
$sql = "SELECT DISTINCT ".$liste_champs." FROM manif,villes WHERE (manifestation_date_debut >='2006/01/16' OR manifestation_date_fin >='2006/01/16') ";
$sql = "AND ".in_array(manifestation.manifestation_ville, $villes_ok)."";
 
mais .. çà marche pas !  
 
si vous avez une idée pour améliorer çà  
merci

mood
Publicité
Posté le 16-01-2006 à 13:18:28  profilanswer
 

n°1284454
cinocks
Posté le 16-01-2006 à 13:40:27  profilanswer
 

Code :
  1. SELECT DISTINCT *
  2. FROM manif LEFT JOIN villes ON villes.nom_ville=manifestation.manifestation_ville
  3. WHERE (manifestation_date_debut >='2006/01/16' OR manifestation_date_fin >='2006/01/16')
  4. AND villes.ref_pays='3'


 
nom_ville est un libellé. Ne pas utiliser ca pour faire une jointure. Privilegier un champ numerique.  
Y'a des index à mettre. J'opterai pour un index sur (identifiant_ville, ref_pays), identifiant_ville etant le champ numerique dit juste au dessus. Un autre index sur (manifestation_date_debut, manifestation_date_fin) pourrait aider.
 
Mais une jointure avec 5000 lignes est normalement immediate.


---------------
MZP est de retour
n°1284501
jhac
Posté le 16-01-2006 à 14:11:35  profilanswer
 

oui ok pour les index  
mais manifestation.manifestation_ville est un libellé et je ne peux donc le comparer qu'avec un autre libellé nom_ville non ?

n°1284534
cinocks
Posté le 16-01-2006 à 14:29:55  profilanswer
 

et si tu changes le libellé d'une ville? Un libellé est une information par une clé-identifiant.
 
Je te conseille donc d'associer une clé (numerique) à un libellé, et de faire tes liens sur cette clé. Donc tu renseignes plutot la clé dans la table des manifestations que le libellé. Comme çà, une modification du libellé, n'impacte pas les autres tables. Et un index sur un numerique est plus leger et beaucoup plus efficace. ;)


---------------
MZP est de retour
n°1284554
jhac
Posté le 16-01-2006 à 14:38:41  profilanswer
 

oui oui bien sur entièrement d'accord sauf que c'est pour implanter sur un système existant déjà avec des milliers de manifs de déjà rentrées !
 
je dois donc faire avec l'existant
mais le in_array c'était pas un bonne idée ?  
plutto que de comparer chaque manif_ville avec toutes lesvilles il ne comparerait qu'avec les villes déjà sélectionnées dans la premiière requete .. mais j'ai jamais vu in_array dns une requete !
une idée ?

n°1284560
cinocks
Posté le 16-01-2006 à 14:41:33  profilanswer
 

quel est l'interet? C'est beaucoup plus efficace une bonne requete avec index. MySql est plus efficace que PHP pour ce genre de trt


---------------
MZP est de retour
n°1284571
jhac
Posté le 16-01-2006 à 14:46:12  profilanswer
 

ok oui  .. tu as raison -  
 
mais donc pas mieux  ?

n°1284575
cinocks
Posté le 16-01-2006 à 14:48:59  profilanswer
 

pas mieux??? quoi? Je ne comprend pas la question :)


---------------
MZP est de retour
n°1284591
jhac
Posté le 16-01-2006 à 14:57:28  profilanswer
 

excuse .. je veux dire on peut donc pas faire un truc plus optimal que  
 
   1.
      SELECT DISTINCT *
   2.
      FROM manif LEFT JOIN villes ON villes.nom_ville=manifestation.manifestation_ville
   3.
      WHERE (manifestation_date_debut >='2006/01/16' OR manifestation_date_fin >='2006/01/16')
   4.
      AND villes.ref_pays='3'

n°1284594
cinocks
Posté le 16-01-2006 à 14:59:49  profilanswer
 

remplace le * par les champs que tu vas utiliser.  
jointure sur numerique plutot que texte et index.
index sur les dates.  
 
Mais les index feront dejà bcp. Ensuite, y'a moyen d'orienter l'optimiseur en jouant avec les conditions.


---------------
MZP est de retour
mood
Publicité
Posté le 16-01-2006 à 14:59:49  profilanswer
 

n°1284604
jhac
Posté le 16-01-2006 à 15:05:00  profilanswer
 

merci

n°1284607
cinocks
Posté le 16-01-2006 à 15:05:30  profilanswer
 

au plaisir.


---------------
MZP est de retour

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  requete sur deux tables à optimiser

 

Sujets relatifs
Pb requete sqlPb écriture requete sql
[MySQL] Comment diminuer (optimiser ?) la taille d'un base[MySQL] Sélection d'un même champs dans plusieurs tables
[CSS] Comment optimiser le chargement des pages avec un menu fixeCréer une requete SELECT a une base de donnée ACCESS
[SQL Server] Executer un fichier SQL depuis une requête[Résolu] Casse dans une requête sql
Recherche avec LIKE optimisersous sql plus exporter les résultats d'une requête dans un fichier
Plus de sujets relatifs à : requete sur deux tables à optimiser


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR