Petite optimisation SQL ?

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par Xophe, 18 Mars 2008.

  1. Xophe
    Xophe WRInaute discret
    Inscrit:
    23 Mars 2005
    Messages:
    135
    J'aime reçus:
    1
    Bonjour,

    il me semble que je peux optimiser ma requête SQL.

    Je dois afficher sur une page une liste d'utilisateurs avec leurs 3 derniers produits. J'ai une table contenant la liste des produits qui indique à qui appartient le produit et sa date d'ajout.

    id_produit (clef primaire)
    id_user
    date

    Aujourd'hui, je récupère *tous* les produits d'une liste d'utilisateurs:
    SELECT * FROM produits WHERE id_user IN (...);

    En PHP, je groupe ensuite les produits par utilisateur et je les classe par date pour ne prendre que les 3 derniers.

    N'y a-t-il pas moyen de faire d'une pierre deux coups et d'indiquer à MySql que je ne souhaite récupérer que les 3 derniers produits ? Du genre avec GROUP BY ou DISTINCT ?

    Merci de votre aide.
     
  2. chtipepere
    chtipepere WRInaute occasionnel
    Inscrit:
    8 Janvier 2004
    Messages:
    428
    J'aime reçus:
    0
    Code:
    SELECT * FROM produits WHERE id_user IN (...) ORDER BY date DESC LIMIT 0,3;
    ORDER BY date DESC : on trie par date décroissante (de la plus récente à la plus ancienne)
    LIMIT 0,3 : On ne veut que les 3 premiers résultats

    Pour info : LIMIT 3,3 ressortira les résultats de 4 à 6 (le premier chiffre étant la position où l'on commence, le deuxième correspondant au nombre de résultats souhaités).
     
  3. jarreweb
    jarreweb WRInaute discret
    Inscrit:
    12 Septembre 2003
    Messages:
    185
    J'aime reçus:
    0
    et ne pas oublier, s'il n'y en a pas, des index sur les colonnes adéquates
     
  4. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 579
    J'aime reçus:
    0
    Pas vraiment ce que voulait l'OP, là tu ne récupères que les 3 derniers produits en tout, pas les trois derniers de chaque utilisateur.

    Plusieurs méthodes:

    (je donne le code en perl, je ne suis pas très bon en php):

    Code:
    join " UNION ALL ",map {"SELECT * FROM produits WHERE id_user=? ORDER BY date DESC LIMIT 3"} @id_users
    
    En gros, on fait une série de SELECT avec un LIMIT pour chaque utilisateur, et on regroupe tout ça avec des UNION ALL. Il me semble d'ailleurs que c'est un chouïa plus compliqué que ça, genre il faut faire un SELECT imbriqué sinon le LIMIT et le UNON ALL se tapent dessus.

    Sinon en SQL pur:

    Code:
    SELECT * FROM produits p1 WHERE id_user IN (...) WHERE id_produit IN (SELECT id_produit FROM produits p2 WHERE id_user=p1.id_user ORDER BY date DESC LIMIT 3)
    Sous toutes réserves, hein, pas testé, et aucune garantie sur la "performance" de la chose (surtout avec mysql).

    Jacques.
     
  5. Xophe
    Xophe WRInaute discret
    Inscrit:
    23 Mars 2005
    Messages:
    135
    J'aime reçus:
    1
    Effectivement Jacques, ta proposition est ce que je souhaite faire.

    Mais comme tu le soulignes, c'est la performance de ce genre de requête qui est inquiétant.

    Je vais faire le test mais dans tous les cas je suppose qu'il est préférable de faire porter la charge par PHP plutôt que par MySql. D'autant plus que je suis hébergé en mutualisé et qu'en général le pb se trouve du coté de la bdd.

    Merci
     
  6. deathwish
    deathwish Nouveau WRInaute
    Inscrit:
    2 Février 2008
    Messages:
    9
    J'aime reçus:
    0
    ... quoique avec ton " * from ", c'est à la fois le PHP et la BDD qui sont surchargés ... car la BDD doit recuperer et envoyer toutes tes données, mais ensuite, PHP doit aussi parser toutes tes données ... alors qu'avec une bonne requete SQL, la BDD ne t'envoie que les données qu'il faut et php fera moins d'itérations ...

    Sinon, faut surtout avoir des index au bon endroit ... car sinon, recuperer tous le contenu de la BDD avec php et le parser avec php sera plus intéressant xD : des requetes optimisé sur une structure de BDD non optimisé c'est pire que tous...
     
  7. mikaweb
    mikaweb WRInaute discret
    Inscrit:
    4 Juillet 2007
    Messages:
    160
    J'aime reçus:
    0
    Toujours déclarer les champs qu'on veut dans son select ;)
    Ca te fait une petite optimisation déjà :p
     
Chargement...
Similar Threads - Petite optimisation SQL Forum Date
Optimisation sql - Petite question Développement d'un site Web ou d'une appli mobile 16 Août 2012
Perte de position sur page catégorie n'ayant plus de petites annonces Débuter en référencement 9 Septembre 2022
Aide petite regex Développement d'un site Web ou d'une appli mobile 28 Juin 2022
Demande d'avis - Petites phrases Présidentielle 2022 Demandes d'avis et de conseils sur vos sites 24 Octobre 2021
Xenforo est-il un outil de création de forum adapté aux petites structures Demandes d'avis et de conseils sur vos sites 20 Avril 2020
Avis sur un site de petites annonces Demandes d'avis et de conseils sur vos sites 25 Novembre 2019
Bonne extension ou solution de petites annonces Développement d'un site Web ou d'une appli mobile 2 Octobre 2019
Dilemme du jour : 2 grosses catégories ou 11 petites ? Débuter en référencement 11 Avril 2019
Petite piqûre de rappel : vidéos Google pour SEO et webmasters Référencement Google 7 Avril 2019
Plusieurs petites boutiques pour accompagner une plus grosse ? e-commerce 15 Février 2019
Supprimer ajax d'une petite fonction JS Développement d'un site Web ou d'une appli mobile 29 Novembre 2018
Milliers d'erreurs 404 sur site de petites annonces Débuter en référencement 25 Septembre 2018
Petite Annonce Gratuite Demandes d'avis et de conseils sur vos sites 19 Juillet 2018
Petite incompréhention SEO Débuter en référencement 11 Décembre 2017
Référencement d'un site de petites annonces : faut-il indexer les annonces ? Référencement Google 23 Novembre 2017
Petite annonce Droit du web (juridique, fiscalité...) 10 Mars 2017
Comment faire connaitre mon site de petites annonces gratuites Demandes d'avis et de conseils sur vos sites 10 Février 2017
Site de petites annonces avec Vidéo pour détailler le bien en vente Demandes d'avis et de conseils sur vos sites 1 Février 2017
Vous voulez une petite place ? Administration d'un site Web 13 Août 2016
Webannuaire et petites annonces gratuites Annuaires et moteurs 9 Mars 2016