Page 1 sur 1

Lenteur d'une requète SQL

Posté : 09 janv. 2013, 17:30
par Kalaw
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 :)

Re: Lenteur d'une requète SQL

Posté : 09 janv. 2013, 17:59
par dix2
il faut poser un ou des index

Re: Lenteur d'une requète SQL

Posté : 09 janv. 2013, 18:46
par AB
Oui typiquement il faut mettre des index sur les champs qui constituent ta clause WHERE.

Re: Lenteur d'une requète SQL

Posté : 09 janv. 2013, 18:55
par dix2
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

Posté : 09 janv. 2013, 18:56
par dix2
et pas sur les clefs primaires, y a déjà un index par défaut

Re: Lenteur d'une requète SQL

Posté : 09 janv. 2013, 19:52
par Kalaw
Parfait ça fonctionne à merveille merci beaucoup à vous =)

Re: Lenteur d'une requète SQL

Posté : 09 janv. 2013, 19:58
par AB
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

Posté : 09 janv. 2013, 21:59
par dix2
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

Posté : 10 janv. 2013, 00:43
par Guiloj
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

Posté : 10 janv. 2013, 02:12
par Perine
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

Posté : 10 janv. 2013, 13:16
par moogli
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 ;) ).


@+