Bonjour,
j'ai une requete assez lourde à optimiser. La version simple marche correctement, mais l'ajout de la clause "et une entrée dans la table planning" me pose pb car la table en question fait 4 millions de lignes.
Je vous présente ma requete (qui dure 10 secondes, je voudrais arriver à < 1 seconde)
En voici la version simple :
'ex' est une table avec une seule colonne (id) et un seul enregistrement. Elle me permet simplement de faire mes restrictions au plus vite et non pas dans la clause where comme j'aurais pu le faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT * FROM ex JOIN AAA use index (VALIDE) on AAA.valide='1' join RRR on AAA.truc = RRR.truc AND RRR.chose='123456' ORDER BY RRR.bidule, AAA.NOM, AAA.PRENOM
Cette version marche correctement, meme si les tables AAA et RRR contiennent chacune 4000 lignes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT * FROM AAA join RRR on AAA.truc = RRR.truc AND RRR.chose='123456' where AAA.valide='1' ORDER BY RRR.bidule, AAA.NOM, AAA.PRENOM
Je dois maintenant m'assurer que chaque AAA a une correspondance dans planning (jointure sur la colonne code)
Ma table planning contient 4 millions d'enregistrements...
J'ai ajouté une jointure sur une sous table et non pas directemente sur planning en espérant minimiser la requete
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 join (select planning.code from ex join planning on year(planning.DATEJOUR)='2010' group by planning.code) planning on planning.code = AAA.code
Pour une requete qui ressemble finalement à ceci
et bon... tout cela prend encore 10 secondes à s'executer. Comment arriver à 1 seconde ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT * FROM ex JOIN AAA use index (VALIDE) on AAA.valide='1' join RRR on AAA.truc = RRR.truc AND RRR.chose='123456' join (select planning.code from ex join planning use index (CODE) on year(planning.DATEJOUR)='2010' group by planning.code) planning on planning.code = AAA.code ORDER BY RRR.bidule, AAA.NOM, AAA.PRENOM
- L'utilisation de "exists(un truc dans planning)" a donné des résultats catastrophiques.
- Le passage par la table ex me semble vraiment interessant
- J'ai un index sur planning.code
- Toutes les colonnes de planning ont une taille fixe (pas de varchar)
- J'ai fait un optimize sur planning mais ca plutot agravé les choses
- Je suis en InnoDb
- Je fais la jointure avec la sous table au dernier moment, lorsque j'ai réduit au maximum le nombre de AAA (parce que bon, tant qu'à faire une jointure sur 4M de lignes, autant la faire le moins de fois possible)
Voila voila, si vous avez des astuces suppémentaires...
Merci déjà de m'avoir lu
JC
Partager