Lenteur d'une requète SQL

Kalaw
Invité n'ayant pas de compte PHPfrance

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 :)

Eléphant du PHP | 267 Messages

09 janv. 2013, 17:59

il faut poser un ou des index

ViPHP
AB
ViPHP | 5818 Messages

09 janv. 2013, 18:46

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

Eléphant du PHP | 267 Messages

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

Eléphant du PHP | 267 Messages

09 janv. 2013, 18:56

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

Kalaw
Invité n'ayant pas de compte PHPfrance

09 janv. 2013, 19:52

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

ViPHP
AB
ViPHP | 5818 Messages

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...

Eléphant du PHP | 267 Messages

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

Petit nouveau ! | 3 Messages

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

Eléphant du PHP | 120 Messages

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 :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

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 ;) ).


@+
Il en faut peu pour être heureux ......