Partage
  • Partager sur Facebook
  • Partager sur Twitter

[MySQL]Between - Sélectionner les x entrées les plus vielles

Sujet résolu
    8 septembre 2010 à 23:15:23

    Bonsoir,

    Je dispose d'une table contenant un grand nombre d'entrée, lorsque je fais une sélection j'utilise un LIMIT, hors le problème avec le LIMIT c'est que MySQL commence d'abord par traité la requête et une fois le traitement terminé renvoie seulement le nombre d'enregistrement demandé, ce qui est une cause de perte de performance.

    J'aimerai par conséquent utilisé la clause Between, cependant je ne sais pas trop comment l'utiliser pour obtenir ce que je désire.

    Voici la structure de ma table:
    CREATE TABLE IF NOT EXISTS `ma_table` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `infos` varchar(255) NOT NULL,
      `derniere_exploration` datetime NOT NULL,
      PRIMARY KEY (`id`),
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    


    J'aimerai par exemple obtenir les 10 lignes les plus anciennes de ma table.

    Comment puis-je faire ?


    Merci de votre attention.
    Cordialement, La source.
    • Partager sur Facebook
    • Partager sur Twitter
      8 septembre 2010 à 23:17:16

      Comment veux-tu que ton SGBDR sache quelles sont les dernières lignes s'il ne les regarde pas toutes...?
      • Partager sur Facebook
      • Partager sur Twitter
        8 septembre 2010 à 23:46:00

        Bah... Oui c'est sur, de toutes façons il faut qu'il les regardent toutes, rien que pour ce qu'il y a dans le WHERE...

        Je sais pas trop comment l'expliqué, mais je sais que le LIMIT filtre une fois la requête exécutée alors que le BETWEEN est une clause exclusoire et donc qui joue son rôle pendant, ce qui fait qu'au final on a de meilleurs performances.
        • Partager sur Facebook
        • Partager sur Twitter
          8 septembre 2010 à 23:53:12

          Et pourquoi est-ce que tu penses que BETWEEN résoudrait ton problème ?
          • Partager sur Facebook
          • Partager sur Twitter
            8 septembre 2010 à 23:58:31

            Je n'ai pas de problème en soi, j'aimerai juste optimisé une requête...

            Par conséquent si MySQL dois jonglé avec moins d'entrée fatalement sont temps de traitement s'en trouve amoindri.

            Je me dois de précisé que sa fait longtemps que je n'ai plus regardé comment BETWEEN fonctionne, simplement que je me rappelle avoir lu quelque part que c'était plus intéressant qu'un LIMIT.

            Par ailleurs j'en avais parlé avec un ami, et il m'avait confirmé que c'était probablement une solution, une autre étant de passé à postgresql, mais sa c'est un peu radical justement pour gérer l'optimisation d'un LIMIT...
            • Partager sur Facebook
            • Partager sur Twitter
              9 septembre 2010 à 3:25:04

              Moi, j'aime bien cette solution, passer à PostgreSQL.

              M'enfin, je vois très difficilement comment un BETWEEN fonctionne car ça inclut plusieurs sous requêtes. La requête qui me vient à l'esprit en premier est évidemment celle avec LIMIT (c'est à ça qu'il sert) :
              SELECT id, infos, derniere_exploration
              FROM ma_table
              ORDER BY derniere_exploration ASC
              LIMIT 10;
              


              La solution avec BETWEEN... j'en vois pas. Ça revient soit à utiliser un LIMIT quelque part, soit supposer que les id se suivront toujours, soit utiliser des fonctions de fenêtrage que MySQL ne supporte pas. Ça donne un truc immonde de ce genre :
              SELECT id, infos, derniere_exploration
              FROM ma_table
              WHERE id BETWEEN
                  (SELECT id
                   FROM ma_table
                   WHERE derniere_exploration = (SELECT MIN(derniere_exploration)
                                                 FROM ma_table)
                   )
                   AND
                       (SELECT id + 10
                        FROM ma_table
                        WHERE derniere_exploration = (SELECT MIN(derniere_exploration
                                                      FROM ma_table)
              ORDER BY derniere_exploration ASC;
              


              Vraiment, je vois pas comment BETWEEN pourrait t'aider. Personnellement, je te suggère d'y aller avec LIMIT, je vois pas d'autres solutions viables sous MySQL.
              • Partager sur Facebook
              • Partager sur Twitter
                9 septembre 2010 à 8:14:05

                Um... bon, bah dommage...

                Je vais tout de même étudier la possibilité de passé a postgreSQL ;) (enfin, sa je verrai plus tard :p, lorsque le reste aura été optimisé :p )

                Merci de ton aide.
                Cordialement, La source.
                • Partager sur Facebook
                • Partager sur Twitter
                  11 septembre 2010 à 4:11:02

                  Salut,

                  Si la colonne par laquelle tu tries est indexée, un LIMIT x n'entrainera aucune perte de performance et un LIMIT x OFFSET Y n'entrainera qu'une « légère » perte de performance due aux sauts dans l'index.
                  Si par contre la clause d'ordonnancement n'est pas indexée, les performances seront très mauvaises puisque là le SGBDR devra effectivement trier les lignes.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 septembre 2010 à 9:38:58

                    Je l'ignorais (et je m'en veux de pas l'avoir deviner :lol: )

                    Je n'ai actuellement pas d'index sur cette colonne, je vais voir si sa se justifie et que les autres requêtes ne dépatisse pas ;)

                    Merci pour l'information.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [MySQL]Between - Sélectionner les x entrées les plus vielles

                    × 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