[RESOLU]Optimisation d'une requête SQL

Optimisation d'une requête SQL [RESOLU] - SQL/NoSQL - Programmation

Marsh Posté le 24-09-2009 à 17:43:59    

Bonjour,
 

mysql> describe fichiers;
+-------------+--------------+------+-----+------------+----------------+
| Field       | Type         | Null | Key | Default    | Extra          |
+-------------+--------------+------+-----+------------+----------------+
| cle         | int(11)      | NO   | PRI | NULL       | auto_increment |
| nom         | varchar(128) | NO   |     |            |                |
| commentaire | text         | YES  |     | NULL       |                |
| vIntegrees  | int(11)      | NO   |     | 0          |                |
| date        | date         | NO   |     | 0000-00-00 |                |
| Poste       | char(1)      | NO   |     | D          |                |
+-------------+--------------+------+-----+------------+----------------+
6 rows in set (0.02 sec)


 

  • Le champ `Poste` vaut soit 'D' soit 'I'
  • Le champ `vIntegrees` >= -1


Je souhaite afficher l'ensemble des enregistrements du même poste 'D' pour chaque jour où au moins un d'entre eux a une valeur `vIntegrees`>-1.
Voici la requête que j'ai fait et qui fonctionne :

SELECT DISTINCT t1.cle, DATE_FORMAT(t1.date, "%d/%m/%y" ) as dateF, t1.nom, t1.vIntegrees, t1.commentaire FROM fichiers t1, fichiers t2 WHERE t1.Poste='D' AND t2.Poste='D' AND t1.date=t2.date AND (t1.vIntegrees > -1 OR t2.vIntegrees > -1) ORDER BY t1.date DESC, t1.nom


 
Un exemple de résultat :
http://dl.free.fr/tM08QpO18
 
Le soucis, c'est que cette requête met plus de 8 secondes à être traitée (ma table contient 4229 enregistrements pour 700Ko, et elle va encore gonfler avec le temps).
Je n'arrive pas à trouver une autre requête qui fonctionne et qui soit plus rapide. Pourtant, je suis sur que c'est possible (peut-être avec un "WHERE (SELECT..." ou un "HAVING" ), mais cela dépasse mes compétences ...
 
Si quelqu'un pouvait m'aider ... merci bien par avance !!!  :jap:


Message édité par mv1 le 25-09-2009 à 14:14:57
Reply

Marsh Posté le 24-09-2009 à 17:43:59   

Reply

Marsh Posté le 24-09-2009 à 23:05:09    

On peut essayer différemment [:proy]  
 
D'abord, récupérer la liste des jours qui nous intéressent (facile) :
SELECT DISTINCT date FROM fichiers WHERE Poste='D' AND vIntegrees > -1
 
Requête complète :
SELECT cle, DATE_FORMAT(date, "%d/%m/%y" ) as dateF, nom, vIntegrees, commentaire
FROM fichiers WHERE date in (
  SELECT DISTINCT date FROM fichiers WHERE Poste='D' AND vIntegrees > -1
) ORDER BY date DESC, nom
 
A voir si c'est plus performant [:figti]

Reply

Marsh Posté le 25-09-2009 à 10:14:08    

Code :
  1. create index ix_fichiers_01 on fichiers(Poste);
  2. create index ix_fichiers_02 on fichiers(`date`);
  3. create index ix_fichiers_02 on fichiers(vIntegrees);


au passage le champs "date" utilise un mot-clé réservé, ce n'est pas très judicieux

Reply

Marsh Posté le 25-09-2009 à 14:14:26    

couak : Merci : l'indexation du champ date améliore largement les choses (1s environ au lieu de 8-9s) !!! (et en effet le nom n'est pas très judicieux ...)
mrbebert : franchement, quand j'ai vu ta solution, je me suis dit : Bingo !!! c'est si évident !! et pourtant ... sur une petite base de test, ça triple le temps. et sur la base de travail, je suis obligé d'interrompre la commande, car elle semble ne jamais se terminer ... dommage : ta requête me plaisait beaucoup !!
 
Merci encore à vous deux pour le temps que vous m'avez accordé !!


Message édité par mv1 le 25-09-2009 à 14:15:37
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed