|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre à l'essai
![]() Inscription : avril 2003 Messages : 83 ![]() |
Bonjour,
J'ai deux tables très différentes sur lesquelles je veux faire un UNION pour pouvoir crées des flux xml. Code :
0.5 + 0.1 != 3 ... Est-ce normal ? Comment accélerer ma requête principale ? Je suis avec mysql 4.1 Merci |
||
|
|
00
|
|
|
#2 |
|
Futur Membre du Club
![]() |
Salut,
Oui cela semble normal que ta requête soit plus longue à executer, car ici : - Pour chaque lignes de ta requête 'principale', tu fais un accès sur la sous-requete. (Ex : 0.5 + 0.1 = 0.6 mais 0.5 + 0.1*nb_lignes ça fait plus) Je ne sais pas vraiment quoi te conseiller pour améliorer cela mais par exemple pour Oracle j'utilise Toad qui m'analyze les requetes et m'affiche les 'full access table', ça peut aider. Je ne sais pas si Toad pour MySQL ou MySQL Administrator le font. @+ |
|
|
00
|
|
|
#3 |
|
Membre à l'essai
![]() Inscription : avril 2003 Messages : 83 ![]() |
Comprends pas ! Quelle sous-requête ?
J'ai essaye de réduire le nb d'élément remonté par la requête 2 (de 1000 à 4) en ajoutant une condition, mais cela ne change rien au temps de calcul ... Des idées ? |
|
|
00
|
|
|
#4 |
|
Membre régulier
![]() Inscription : mars 2006 Messages : 72 ![]() |
Je veux bien croire que chaque requête séparemment est rapide.
je ne sais pas combien de lignes sont ramenées par ta requête mais : - le order by à la fin est très gourmand en calcul - le union par défaut élimine les lignes doublons et ça aussi c'est couteux La seule piste que je peux te suggérer est de placer un 'explain' devant ta requête pour voir comment celle-ci est évaluée. |
|
|
00
|
|
|
#5 | ||||
|
Membre à l'essai
![]() Inscription : avril 2003 Messages : 83 ![]() |
Citation:
Citation:
Merci Edit : Vu UNION ALL mais cela ne change rien par rapport à UNION à partir du momment ou les deux requêtes ne retourne qu'un numbre limité de lignes. En mettant UNION ALL à la place de UNION sur la requete initiale on gagne environ 1 seconde mais ce n'est pas assez performant. Un explain de la requete avec UNION ALL me donne ça Code :
|
||||
|
|
00
|
|
|
#6 |
![]() ![]() Pierre CabocheInscription : octobre 2005 Messages : 2 197 ![]() |
Je ne connais pas les détails liés à l'implémentation mais as-tu essayé de:
1) créer une table temporaire, faire un INSERT IGNORE INTO... SELECT (IGNORE = à cause des doublons) avant de fair un SELECT * FROM table_temp ORDER BY ... ? 2) D'avoir 2 curseurs qui parcours les résultats des 2 SELECT (triés) tout en s'assurant que le résultat reste ordonné et ne comporte pas de doublons ?
__________________
Derniers articles: (SQL Server) Introduction à la gestion des droits (UML) Souplesse et modularité grâce aux Design Patterns (UML) Le Pattern Etat Autres articles... |
|
00
|
|
|
#7 | ||
|
Membre à l'essai
![]() Inscription : avril 2003 Messages : 83 ![]() |
Citation:
A moins de faire l'insertion dans la table temp en deux temps puis un troisième requête pour faire le order --> cela me semble mieux sachant que je peux mettre un limit dans les deux premiers cela limitera de fait le nb de lignes à traiter. Mais passer par une table temporaire ce n'est pas très propre non ? Je vais faire les deux tests et je vous donnerai les résultats Citation:
|
||
|
|
00
|
|
|
#8 |
|
Membre éclairé
![]() Jota Alves Inscription : janvier 2006 Messages : 263 ![]() |
slt.
ton explain veut dire que ton serveur mysql va lire 27*1357*1*1*1*1222 lignes=44.772.858 lignes.... soit t´essaye de diminuir le nº de lignes lus par annu_sites,soit dans la table t. regarde si tu peut mettre des uniques, ou des primary key sur tes champs. |
|
|
00
|
|
|
#9 | |||
|
Membre à l'essai
![]() Inscription : avril 2003 Messages : 83 ![]() |
Citation:
Citation:
Citation:
|
|||
|
|
00
|
|
|
#10 | ||||
![]() ![]() Pierre CabocheInscription : octobre 2005 Messages : 2 197 ![]() |
Citation:
1) tu insères les données du premier SELECT dans la table temp 2) tu insères les données du deuxième SELECT dans la table temp (avec le IGNORE à cause des doublons) 3) tu fais un SELECT * FROM temp ORDER BY ... Et en effet, tu peux faire un LIMIT lors des insertions Citation:
Citation:
Ce que je veux dire, c'est que tu prends deux curseurs. 1) Pour chacun d'eux, tu lis le premier élément (mysql_fetch_row) 2) tu compares les deux enregistrements, tu affiches le plus récent 3) tu fais un mysql_fetch_row pour le curseur ayant retourné l'enregistrement que tu viens d'afficher 4) si le curseur en question ne retourne plus de résultat, tu affiches les enregistrements retournés par l'autre curseur, sinon tu retournes en 2 Tu connais la partie "fusion" de l'algorithme de tri fusion? Et bien là, c'est pareil: on a 2 listes triées (nos tables, triés au moyen de nos deux SELECT) que l'on parcours à l'aide de curseurs. Là, on est en train de fusionner le résultat de ces deux listes triées pour en faire une troisième, également triée, qui est la fusion des 2. Citation:
__________________
Derniers articles: (SQL Server) Introduction à la gestion des droits (UML) Souplesse et modularité grâce aux Design Patterns (UML) Le Pattern Etat Autres articles... |
||||
|
00
|
|
|
#11 | ||
|
Membre à l'essai
![]() Inscription : avril 2003 Messages : 83 ![]() |
Citation:
Citation:
Mais bon je vais voir ce que je peux trouver.Rdv la semaine prochaine (parce que là c'est le WE |
||
|
|
00
|
|
|
#12 | ||
![]() ![]() Pierre CabocheInscription : octobre 2005 Messages : 2 197 ![]() |
Citation:
Citation:
__________________
Derniers articles: (SQL Server) Introduction à la gestion des droits (UML) Souplesse et modularité grâce aux Design Patterns (UML) Le Pattern Etat Autres articles... |
||
|
00
|
|
|
#13 | |
|
Membre à l'essai
![]() Inscription : avril 2003 Messages : 83 ![]() |
Citation:
|
|
|
|
00
|
|
|
#14 |
![]() ![]() Pierre CabocheInscription : octobre 2005 Messages : 2 197 ![]() |
T'as bien raison! Profite de ton week-end.
__________________
Derniers articles: (SQL Server) Introduction à la gestion des droits (UML) Souplesse et modularité grâce aux Design Patterns (UML) Le Pattern Etat Autres articles... |
|
00
|
|
|
#15 |
|
Membre éclairé
![]() Jota Alves Inscription : janvier 2006 Messages : 263 ![]() |
sur ta table annu_sites, presque sur que ta pas d´index sur activation.
et si l´explain que ta mis, est avec union all, il lit les lignes que je t´ai dis. |
|
|
00
|
|
|
#16 | ||||
|
Membre éclairé
![]() Jota Alves Inscription : janvier 2006 Messages : 263 ![]() |
et sur
Code :
Code :
|
||||
|
|
00
|
|
|
#17 |
|
Membre à l'essai
![]() Inscription : avril 2003 Messages : 83 ![]() |
léger gain en indexant activation
par contre pas de changement visible avec Code :
INNER JOIN forums AS f WHERE t.forum_id=f.id forum_id = Index |
|
|
00
|
|
|
#18 | |
![]() ![]() Pierre CabocheInscription : octobre 2005 Messages : 2 197 ![]() |
Citation:
__________________
Derniers articles: (SQL Server) Introduction à la gestion des droits (UML) Souplesse et modularité grâce aux Design Patterns (UML) Le Pattern Etat Autres articles... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com