#1 04-11-2006 12:21:20

fbparis
Survivors
Lieu: Paris
Date d'inscription: 14-07-2006
Messages: 1896
Site web

optimiser une requete sql

J'en appelle aux experts, j'ai des requetes SQL qui moulinnent gravement et je sais pas comment optimiser le bouzin pour que ca aille plus vite, elles sont du genre suivant  :

Code:

$q = mysql_query("SELECT DISTINCT(a.`keyword`) FROM `lycos_results` as a,`tmp` as b WHERE a.`scanID`='$scanID' AND a.`datacenter`='$datacenter' AND a.`domain`='$domain' AND a.`keyword`=b.`keyword`");
$numberQueries = mysql_num_rows($q);

la table lycos_results a un peu plus de 600 000 lignes, la table temporaire tmp 1250 lignes.

cette requete doit prendre presque 3s et le cpu du kimsufi est a 99% la, j'ai 10 000 lignes a calculer de la sorte et plusieurs requetes de ce type a chaque fois donc c pas possible la, zavez une idee de comment je pourrais optimiser tout ca ? en lockant les tables ?

Hors ligne

 

#2 04-11-2006 12:41:45

Vincent
Tagglers
Lieu: Bordeaux supérieur
Date d'inscription: 10-07-2005
Messages: 349

Re: optimiser une requete sql

Tu as essayé avec un index sur ton champs keyword?
Bienqu'il ne soit pas utilisé dans la clause Where, cela peut avoir une incidence sur le distinct.


origine des expressions - Splopre kiwoui - Ma nouvelle piscine cherche des amis.

Hors ligne

 

#3 04-11-2006 12:58:34

fbparis
Survivors
Lieu: Paris
Date d'inscription: 14-07-2006
Messages: 1896
Site web

Re: optimiser une requete sql

Les index oui, et tout a été calculé en 2 minutes !!!!

Merci à Malaiac qui m'a inspiré smile (merci aussi Vincent mais c trop tard eheh)

Hors ligne

 

#4 04-11-2006 16:08:04

Anonymus
Crying Freeman
Lieu: lat:45.387842, long:4.78314
Date d'inscription: 04-07-2005
Messages: 1164
Site web

Re: optimiser une requete sql

Code:

WHERE a.`scanID`='$scanID' AND a.`datacenter`='$datacenter' AND a.`domain`='$domain' AND a.`keyword`=b.`keyword`");

Tu mets tous ces champs dans un seul, ca ne te fera qu'un seul 'and'. mais je ne pense pas que ce soit la meilleure solution hmm
Sinon, tu peux faire le premier select sur la première table, puis créer une table temporaire avec le résultat, et piocher dans la seconde avec ta table 'temp'.

Enfin, tu devrais essayer avec les left join, pour la table temp. C'est probablement la meilleure solution.

Là, tu commences par construire une table temporaire de 600 000 x 1250 lignes, et ensuite seulement tu commences le tri. C'est pas le plus optimisé hmm

Que donne une requète 'explain' ?

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 R. Andersson