Lenteur d'une requète SQL

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Lenteur d'une requète SQL

Re: Lenteur d'une requète SQL

par moogli » 10 janv. 2013, 13:16

Les clés étrangères posent - suivant la configuration de la base de données - généralement des indexes. Mais normalement, une clé étrangère n'est pas un index Une clé étrangère est généralement seulement une contrainte d'intégrité référentielle
contrainte, normalement, posée sur un PK, donc sur un index (sinon c'est le merdier ;) ).


@+

Re: Lenteur d'une requète SQL

par Perine » 10 janv. 2013, 02:12

Oui typiquement il faut mettre des index sur les champs qui constituent ta clause WHERE.
pour le champ du ORDER BY aussi
Je serais moins systématique pour le ORDER BY. Si le premier filtre (la clause WHERE) ne renvoie pas beaucoup de résultats, créer un index pour ordonner quelques dizaines de lignes peut s'avérer contre productif...
Surtout pas pour cette requête-ci. Les indexes sont très rarement utilisés pour les order by de champs multiples (sauf si tous les champs sont dans le même index).

Les clés étrangères posent - suivant la configuration de la base de données - généralement des indexes. Mais normalement, une clé étrangère n'est pas un index ;) Une clé étrangère est généralement seulement une contrainte d'intégrité référentielle :)

Re: Lenteur d'une requète SQL

par Guiloj » 10 janv. 2013, 00:43

Bonjour,

Pour la requête il est préférable de l’écrire comme ceci :
$sql = "SELECT j.id_joueur
                       , pseudo
                       , statut
                       , nom_rue
                       , voiture
                       , lieu 
             FROM tbl_joueurs j
                       JOIN tbl_rues p ON p.id_joueur = j.id_joueur 
              ORDER BY pseudo ASC 
              LIMIT $premiereligne, $nb_aff";
J'ai simple sortie de la clause "WHERE" la jointure elle est dans le JOIN
Cela n'a pas d'impacte directe sur la rapidité mais a le mérite d’être plus claire surtout quand les requêtes sont imposantes (dans l'avenir :D ).

Pour la rapidité d’exécution je pense qu'il doit manquer une Clé étrangère entre la table tbl_joueur et tbl_rue.

Cdt

Re: Lenteur d'une requète SQL

par dix2 » 09 janv. 2013, 21:59

Oui typiquement il faut mettre des index sur les champs qui constituent ta clause WHERE.
pour le champ du ORDER BY aussi
Je serais moins systématique pour le ORDER BY. Si le premier filtre (la clause WHERE) ne renvoie pas beaucoup de résultats, créer un index pour ordonner quelques dizaines de lignes peut s'avérer contre productif...
pas faux

Re: Lenteur d'une requète SQL

par AB » 09 janv. 2013, 19:58

Oui typiquement il faut mettre des index sur les champs qui constituent ta clause WHERE.
pour le champ du ORDER BY aussi
Je serais moins systématique pour le ORDER BY. Si le premier filtre (la clause WHERE) ne renvoie pas beaucoup de résultats, créer un index pour ordonner quelques dizaines de lignes peut s'avérer contre productif...

Re: Lenteur d'une requète SQL

par Kalaw » 09 janv. 2013, 19:52

Parfait ça fonctionne à merveille merci beaucoup à vous =)

Re: Lenteur d'une requète SQL

par dix2 » 09 janv. 2013, 18:56

et pas sur les clefs primaires, y a déjà un index par défaut

Re: Lenteur d'une requète SQL

par dix2 » 09 janv. 2013, 18:55

Oui typiquement il faut mettre des index sur les champs qui constituent ta clause WHERE.
pour le champ du ORDER BY aussi

Re: Lenteur d'une requète SQL

par AB » 09 janv. 2013, 18:46

Oui typiquement il faut mettre des index sur les champs qui constituent ta clause WHERE.

Re: Lenteur d'une requète SQL

par dix2 » 09 janv. 2013, 17:59

il faut poser un ou des index

Lenteur d'une requète SQL

par Kalaw » 09 janv. 2013, 17:30

Bonjour à tous,

Je me permet de poster mon problème ici car je n'arrive pas à trouver de solution seul ou sur internet.


J'ai une requête SQL qui ressemble à cela :
$sql = "SELECT j.id_joueur, pseudo, statut, nom_rue, voiture, lieu FROM tbl_joueurs j, tbl_rues p WHERE p.id_joueur = j.id_joueur ORDER BY pseudo ASC LIMIT $premiereligne, $nb_aff";
C'est une requête qui est censée m'afficher ensuite un tableau avec diverses informations et le tout avec une pagination (d'ou les variables sur le LIMIT).
Il n'y a que 32 000 enregistrements sur la table tbl_rues et 13 000 sur tbl_joueurs.


Une page avec 25 affichages met 38 secondes à s'afficher et je ne sais pas d'ou proviens cette lenteur incroyable ?


Merci d'avance de prendre le temps de me lire et d'éventuellement me répondre :)