IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Vitesse d'exécution de requête entre max et order desc limit 1)


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut Vitesse d'exécution de requête entre max et order desc limit 1)
    Bonjour,

    On a fait développer un programme en C++ pour faire de l'acquisition de données avec ensuite écriture dans plusieurs tables d'une base MySQL (sous-entendu je ne suis pas développeur mais utilisateur).

    Régulièrement, le programme écrit des données dans la table 1 avec, en particulier, une colonne NumeroAcquis (type int auto-incrémenté).
    Puis le programme interroge la table 1 pour aller chercher le dernier n° de la colonne NumeroAcquis (type int auto-incrémenté) et aller le copier avec d'autres données dans une table 2.
    On a remarqué que plus la table 1 grandit, plus le temps pour récupérer ce dernier n° augmente.

    En regardant le programme, on a vu que le programmeur faisait un
    SELECT NumeroAcquis from table 1;
    Puis faisait une boucle en C++ pour trouver la dernière ligne.
    Donc plus la base grandit (et elle grandit rapidement), plus ça prend du temps.

    En regardant à droite à gauche, j'ai vu que je pouvais faire la même chose avec un
    SELECT max(NumeroAcquis) from table 1;
    ou avec un
    SELECT NumeroAcquis from table1 order by NumeroAcquis DESC LIMIT 1;

    Pouvez-vous me dire quelle requête est préférable en terme vitesse ou me dire comment vérifier la vitesse de ces deux requêtes ?

    Une dernière question (ou deux) pour la route : j'ai aussi vu une commande last_insert_id(). Mais je n'arrive pas à l'utiliser (il sort toutes les lignes remplies avec un 0). Est-une bonne commande pour ce que je veux faire (plus rapide que les 2 précédentes) ? Et si oui, comment l'utiliser ?

    Merci par avance pour votre aide,
    Bon week-end,
    Ptit Bleu.

  2. #2
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par ptit_bleu Voir le message
    En regardant à droite à gauche, j'ai vu que je pouvais faire la même chose avec un
    SELECT max(NumeroAcquis) from table 1;
    ou avec un
    SELECT NumeroAcquis from table1 order by NumeroAcquis DESC LIMIT 1;

    Pouvez-vous me dire quelle requête est préférable en terme vitesse ou me dire comment vérifier la vitesse de ces deux requêtes ?
    La première peut éventuellement être plus rapide d'un cheveux. C'est la syntaxe normale pour récupérer la plus grande valeur. La deuxième a l'avantage de permettre de rajouter des champs à la clause SELECT pour récupérer tout le dernier enregistrement. Si on se limite au numéro elle seront probablement équivalentes. Quelle que soit a syntaxe utilisée il sera critique de disposer d'un index sur "NumeroAcquis".

    Pour ce qui est des vérifications il y aurait "SHOW INDEXES FROM [...]" et aussi un bon gros "EXPLAIN" de la requête (idéalement je crois que la dernière colonne devrait indiquer "using index").


    Citation Envoyé par ptit_bleu Voir le message
    Une dernière question (ou deux) pour la route : j'ai aussi vu une commande last_insert_id(). Mais je n'arrive pas à l'utiliser (il sort toutes les lignes remplies avec un 0). Est-une bonne commande pour ce que je veux faire (plus rapide que les 2 précédentes) ? Et si oui, comment l'utiliser ?
    "last_insert_id" est un peu différent mais pourrait être tout à fait approprié ici (notamment il n'a pas besoin d'un index pour être efficace et sera probablement encore plus rapide). Il permet, juste après avoir réalisé une (ou plusieurs) insertions avec une valeur auto-incrémentée, d'en récupérer la dernière valeur utilisée.

    Pour l'utiliser il faut faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT LAST_INSERT_ID();
    immédiatement après la dernière insertion. Exactement une ligne devrait être retournée.

    Je ne l'ai jamais vraiment utilisée alors je conseillerais plutôt d'aller voir du côté de la doc qui donne les détails de son comportement.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Merci pour ta réponse Sivrît.
    Je vais suivre tes conseils (le "max" et tester la commande "explain").
    Pour le last_insert_id, je vais passer l'info au programmeur pour qu'il intègre et teste cette solution dans son script.

    Encore merci,
    Bonne semaine,
    Ptit Bleu.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut Toujours le problème de vitesse
    Bonjour,

    J'avais coché "Résolu" mais ce n'est au final pas vraiment le cas.
    Avec la requête "select max", après 2 semaines d'acquisition, le temps entre 2 acquisitions (correspondant à la récupération du n° de la dernière ligne et l'écriture des données de la dernière acquisition) a quasiment doublé (de 4 à 8 secondes).

    Pour moi, le temps d'écriture devrait être constant, mais je ne sais pas comment le vérifier. Donc le souci vient sans doute du temps pour récupérer la dernière ligne.

    Est-ce que vous auriez une idée de requête pour améliorer la vitesse de la requête ?
    (je n'ai pas encore testé la solution last_insert_id - serait-ce la solution ? ...)

    Merci par avance,
    Bonne semaine,
    Ptit Bleu.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 44
    Points : 30
    Points
    30
    Par défaut Désolé ...
    Après un examen plus en détail du programme, le problème ne vient pas de
    "select max" mais d'une commande DBActivateMap.
    J'ai lancé un nouveau post à ce sujet.
    Fin de ce post.

    Désolé pour l'erreur de diagnostic ...
    et merci par avance à ceux qui m'aideront ma question sur DBActivateMap.
    Ptit Bleu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Temps d'exécution de requête différent entre SSMS et C#
    Par Vonziz dans le forum Développement
    Réponses: 12
    Dernier message: 12/09/2013, 09h07
  2. Problème de vitesse d'exécution entre Debug et Relase
    Par Zarr.be dans le forum Général Dotnet
    Réponses: 11
    Dernier message: 29/08/2013, 07h45
  3. Réponses: 3
    Dernier message: 20/11/2010, 12h20
  4. Différences de comportement (vitesse d'exécution ?) entre IE (6, 7) ....
    Par mikmik53 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/07/2008, 16h10
  5. [SQL] Différence d'exécution d'une requête entre phpmyadmin et php
    Par lodan dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 31/08/2006, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo