begin process at 2012 05 26 22:57:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

SQL

 > 

MySQL

 > 

Requêtes

 > 

Optimisation d'une sous-requête SQL


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Optimisation d'une sous-requête SQL

lundi 28 décembre 2009 à 03:17:24 | Optimisation d'une sous-requête SQL

Lugdunum2

Bonjour,

Dans le cadre de l'optimisation des requêtes SQL d'un site web, je me retrouve avec une grande question dont je n'ai pas trouvé de réponse dans la documentation officielle de MySQL.

Ma question concerne donc la requête suivante:

Code :
SELECT a.id,a.forum_name,a.forum_desc,a.forum_lock,
(SELECT COUNT(*) FROM forums_msg WHERE cat=a.id) AS nbr_msg,
(SELECT login FROM members WHERE id=auth LIMIT 1) AS login
(SELECT auth FROM forums_msg WHERE cat=a.id ORDER BY id DESC LIMIT 1) AS auth,
(SELECT reply FROM forums_msg WHERE cat=a.id ORDER BY id DESC LIMIT 1) AS reply,
(SELECT date FROM forums_msg WHERE cat=a.id ORDER BY id DESC LIMIT 1) AS last_date
FROM forums AS a WHERE a.forum_cat='1' ORDER BY a.forum_name ASC;


La requête retourne le résultat escompté, mais elle demande 0.65 seconde pour être exécutée, multiplié par 4 pour l'affichage complet du forum, on arrive donc à plus de 2 secondes, ce qui est impensable pour un site avec plusieurs centaines de connectés simultanément.

Il doit bien y avoir une solution pour optimiser les 3 sous-requêtes qui se ressemblent:

Code :
(SELECT auth FROM forums_msg WHERE cat=a.id ORDER BY id DESC LIMIT 1) AS auth,
(SELECT reply FROM forums_msg WHERE cat=a.id ORDER BY id DESC LIMIT 1) AS reply,
(SELECT date FROM forums_msg WHERE cat=a.id ORDER BY id DESC LIMIT 1) AS last_date


Si vous avez une petite idée je vous en serais très reconnaissant ;-)

Merci d'avance et bonnes fêtes de fin d'année à tous :)

Vlaad
lundi 18 janvier 2010 à 19:48:44 | Re : Optimisation d'une sous-requête SQL

nhervagault

Administrateur CodeS-SourceS
salut,

Code :
SELECT a.id,a.forum_name,a.forum_desc,a.forum_lock,
login, COUNT(*) as nbr_msg, auth,reply, last_date
FROM forums AS a WHERE a.forum_cat='1' ORDER BY a.forum_name ASC
INNER JOIN forums_msg ON cat = a.id
INNER JOIN members  ON id=auth
GROUP BY a.id,a.forum_name,a.forum_desc,a.forum_lock,
login,auth,reply, last_date


Peux-tu exprimer ta demande plus précisement le but de la requete ou niveau fonctionnel?

Nombre de message par categorie ???

Il est peut être plus simple de faire 2 requetes.

Les sous-requetes ne sont pas trop recommandées.
jeudi 21 janvier 2010 à 16:26:16 | Re : Optimisation d'une sous-requête SQL

lenono75

+1 à la réponse de nhervagault !

Enlève le count(*) de ta requête, ça prend beaucoup ça ! Et fais ce count dans une requete distincte, ça aidera.

Pour les sous requete où tu sélectionnes un élément, pareil, externalises ces requêtes !

Bonne journée,

Arnaud
jeudi 21 janvier 2010 à 19:35:34 | Re : Optimisation d'une sous-requête SQL

nhervagault

Administrateur CodeS-SourceS
@lenono75

Je ne pense que l'* dans le count apporte plus de performance,
je penserais le contraire de cette maniere il y pas besoin de recherche une colonne dans les colonnes de la table ou des resultats.

L'optimiseur doit connaitre ce type de pratique




Cette discussion est classée dans : select, id, from, forums, where


Répondre à ce message

Sujets en rapport avec ce message

SELECT + float(5,2) [ par djagger ] Salut !je fais la requete suivante :SELECT * FROM my_tarif WHERE min=15.49ca ne marche pas !!!!!?????par contre :SELECT * FROM my_tarif WHERE min</STR Requêtes imbriquées. Erreur [ par patatedu65 ] Bonjour,j'aimerai qu'on m'aide à toruver une solution au problème que je vous expose tout de suite.J'ai développé un site en PHP/MySQL. J'ai fait mes Requete Imbriqué Erreur Aussi :s [ par SF2Boss ] Voici La requete Rebelle : SELECT </s Problème de select multiples dans plusieurs tables [ par superseb801 ] bonjour, J'ai un problème, je voudrais faire une requête sur plusieurs tables en même temps (3 pour être plus précis), et avec d'autres SELECT dans le Resultat incompréhensible [ par JALEO WAHRANI ] Bonjour, j'ai une base avec 2 tables: 'perso et client', perso a pour colonnes:id, prop, etatétat vaut 'Y' si on effectue un suivi, sinon (par défaut) Défit pour un pro [ par zazadec ] Question de se compliquer la vie, je dois reprendre un site avec une bdd déjà existante... bref vous avez compris j'ai pas le choix.2 tables T1 et T2 Cette sous-requête peut retourner au plus un enregistrement [ par mariam1987 ] Salut à tous, Je débute en SQL et j'ai créé la requête : <p c optimisation de la clause WHERE sur des champs dates [ par ThierH ] Bonjour j'ai une table SQL Server (2005) contenant plus de 50000 lignes. Dans chaque ligne, j'ai des données de type datetime, integer, ... Mon applic Utilisation de clause where stockée en DB [ par Badside ] Bonjour, J'aimerais récupérer la somme de plusieurs montants stockés dans une table et sélectionnés sur des critères repris dans une clause where sto procedure de mise à jour [ par LiKayn ] Salut, je suis debutant en sql et je viens de commencer les procedures stockées dernierement. je travaille sur un mini projet en asp en relation avec


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales