Partage
  • Partager sur Facebook
  • Partager sur Twitter

GROUP BY sur deux colonnes

Sur une table de plusieurs millions d'entrées

    16 mai 2011 à 13:03:48

    Bonjour les Zéros,

    Je m'adresse à vous car je suis confronté à un sacré problème depuis déjà quelques jours sans solution (ou même un début de piste potable).

    J'ai une table MySQL avec plus de 9,4 millions d'entrées composé comme suit :

    productId varchar(10), sellerId varchar (10), et d'autres qui nous intéresse pas ici.
    J'ai un index sur ces deux colonnes + une troisième.

    Ce que je cherche à obtenir, c'est la liste des couples productId - sellerId distinct, j'avais pour requête :

    SELECT productId, sellerId FROM table GROUP BY productId, sellerId;
    


    Le souci avec cette requête, c'est la création de table temporaire, or, sur 9,4 millions de ligne, la mémoire utilisé dépasse largement les capacités de la machine...

    Je chercher donc une solution qui me permettrais d'obtenir le même résultat qui puisse fonctionner.

    En complément voici un "explain" de la requête :

    mysql> EXPLAIN SELECT productId, sellerId FROM table GROUP BY productId, sellerId;
    
    +----+-------------+---------+-------+---------------+----------+---------+------+---------+----------------------------------------------+
    | id | select_type | table   | type  | possible_keys | key      | key_len | ref  | rows    | Extra                                        |
    +----+-------------+---------+-------+---------------+----------+---------+------+---------+----------------------------------------------+
    |  1 | SIMPLE      | table   | index | NULL          | PrSubSel | 187     | NULL | 9477853 | Using index; Using temporary; Using filesort |
    +----+-------------+---------+-------+---------------+----------+---------+------+---------+----------------------------------------------+
    


    Merci d'avance à tous ceux qui plancherons sur mon problème et bonne journée :)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      16 mai 2011 à 14:04:52

      Si tu le prends comme ça, débrouille toi...
      • Partager sur Facebook
      • Partager sur Twitter
        16 mai 2011 à 14:44:37

        As-tu déjà été confronté au problème Enax ?

        Je veux dire, j'ai essayé cette solution (il me semble) au début, j'avais des erreurs de table temporaire trop volumineuse...
        Je fais un explain sur ta requête, il me signale une création de table temporaire...

        Alors pourquoi est-ce que ta requête fonctionne ?!?!

        Soit tu m'a pris pour un gamin du SQL, soit tu as du génie d'avoir déjà été confronté à la problématique...

        ***************************************
        EDIT

        Par contre, avec un LIMIT à partir de 8 millions, la mémoire dit "j'en peux plus"...
        Donc ça ne résous pas totalement mon problème...
        • Partager sur Facebook
        • Partager sur Twitter
          16 mai 2011 à 17:22:04

          Tu cherches à en faire quoi des 8 Millions d'enregistrements ?

          Tracker.
          • Partager sur Facebook
          • Partager sur Twitter
            16 mai 2011 à 23:06:39

            Citation : Tonoki

            Le souci avec cette requête, c'est la création de table temporaire, or, sur 9,4 millions de ligne, la mémoire utilisé dépasse largement les capacités de la machine...



            L'utilisation de temporaires ne devrait pas dépasser plus de 300 Mo (environ), donc, non. Un e requête comme ça peut ramer mais certainement pas planter.

            Donne la définition de ton index, le nombre de lignes retournées (ou SELECT count(DISTINCT productId, sellerId) FROM table), et une explication détaillée de ce que tu fais du résultat et comment tu l'utilises.

            Note qu'il faut mettre les colonnes dans le GROUP BY dans le même ordre que dans l'index...
            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2011 à 17:38:37

              Désolé pour la réponse tardive.
              Je n'ai plus accès à la base de données le patron ayant mis quelqu'un d'autre sur le projet.
              Je ne pourrais pas vous dire le fin mot de l'histoire et je ne peux donner plus de détails, les données (ainsi que tous le reste) étant assez confidentielles :/

              @Enax : Je suis désolé si tu as mal pris ma réponse, elle n'était pas du tout méchante j'étais juste étonné que quelque chose que j'avais déjà essayé fonctionne (du moins en partie). Encore merci pour ton aide.

              Je remet la requête qu'Enax avait proposé :

              SELECT DISTINCT productId, sellerId FROM table;
              


              Sinon pour répondre un peu à Lord Casque Noir, un count(*) sur les couples distinct me retournais à peu près 8,8 millions de résultat (sur les 9,4 millions de lignes).

              Avec le résultat que je pagine (par tranche de 100 000 d'où le LIMIT par la suite), je traitais ces fameux couples productId/sellerId (je ne peux en dire plus).

              Citation : Lord Casque Noir

              Note qu'il faut mettre les colonnes dans le GROUP BY dans le même ordre que dans l'index...



              Merci pour l'info je ne savais pas ;)

              Merci encore à ceux qui ont pris la peine de réfléchir sur mon problème, merci ;)

              Bonne journée

              • Partager sur Facebook
              • Partager sur Twitter

              GROUP BY sur deux colonnes

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown