Forum Programmation.shell mesurer temps d'exécution mysql

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
14
oct.
2016

Bonjour

Je cherche à tester des opti de requete mysql et pour ca je me suis fait un petit script mais les résulat renvoyé ne semble pas cohérent?
Une idée?

    #!/bin/bash
    fichier=results.csv
    passroot***
    db=***
    nbloops=100
    if [ -f $fichier ]
    then
        rm -f $fichier
    fi
    echo ""
    echo ""
    echo "╔═══════════════════════════════════════════════════╗"
    echo "║                                                   ║"
    echo "║  Script de comparaison de deux requetes mysql     ║"
    echo "╠═══════════════════════════════════════════════════╣"
    echo "║ * @author: Gotcha5832 <gotcha5832 @ hotmail.fr>     ║"
    echo "╠═══════════════════════════════════════════════════╣"
    echo "║ HOWTO : ./script \"requete1\"  \"requete2\" \"…\"       ║"
    echo "╚═══════════════════════════════════════════════════╝"
    echo ""
    echo ""
    for p in "$@";
        do
        deb=`date +%s%N`
            echo "$p"
            echo " --> Demarrage : $deb";
            i=1
            echo -e "______________________\n$p">>$fichier
            while ((i<=$nbloops))
            do
                mysql -u root --password="$passroot" "$db" -e "$p" -s > /dev/null 2>&1
                i=$(expr 1 + $i)
                echo "$i">>$fichier
            done

            fin=`date +%s%N`
            echo " --> fin : $fin"
            duree=$(($(( $fin - $deb ))/$((1000000*$nbloops))))
            echo "-----------------------"
            echo "Durée moyenne = $duree"
            echo "_____________________________________________________________________________ "
                echo -e "$i\t$deb\t$fin\t-->$duree">>$fichier
        done

P.S: requête e effectué en SQL_NO_CACHE

  • # MySQL Workbench

    Posté par  (site web personnel) . Évalué à 1.

    Ce logiciel s'il te donne les temps d'exécution, est aussi capable analyser les requêtes (avec un résultat textuel ou graphique) comme voir si un index est utilisé, si une table temporaire est créée etc…

    Ce n'était peut être pas ce que tu cherches, mais pour optimiser des requêtes avec MySQL ça me semble le mieux.

    • [^] # Re: MySQL Workbench

      Posté par  . Évalué à 1.

      ouais mais c'est sur un serveur

      • [^] # Re: MySQL Workbench

        Posté par  (site web personnel) . Évalué à 2.

        Il peut très bien se connecter à un serveur distant (et donc pas uniquement à localhost).

      • [^] # Re: MySQL Workbench

        Posté par  (site web personnel) . Évalué à 6.

        Ce n'est pas Mysql Workbench qui analyse la requête mais Mysql lui-même, tu peux donc faire la même chose en requêtant le serveur avec la commande EXPLAIN.
        Tu peux aussi utiliser le performance schema pour voir comment ta requête se comporte.
        Généralement lancer x fois une requête n'est pas très utile, car le comportement peut-être assez différent en production (cache, verrous, taille du jeu de données, etc). Tu peux donc commencer par utiliser explain pour vérifier que la requête utilise des index, évite les tables temporaires, etc. et ensuite utiliser performance schema pour voir comment elle se comporte en production.

  • # Bonjour

    Posté par  . Évalué à 2.

    Je ne comprends pas à quoi sert la variable $i.

    les résulat renvoyé ne semble pas cohérent?

    Tu pourrais nous les montrer (arguments passés au script et affichage obtenu) ? En quoi te semblent-ils incohérents ?

    • [^] # Re: Bonjour

      Posté par  . Évalué à 1.

      Le $i sert simplement a là boucle et la vérifier.

      Sinon pour la cohérence c'est simplement qu'il peut me donner 11ms pour un select très simple avec index et qui retourne 1 résultat et 12ms pour une requete avec 15 jointure sans index qui retourne 15000 résultat

      • [^] # Re: Bonjour

        Posté par  . Évalué à 2. Dernière modification le 15 octobre 2016 à 17:37.

        Le $i sert simplement a là boucle et la vérifier.

        OK merci, c’est ce que je me suis dit mais j’avais peur de louper un truc… C’est important de virer ce code de debug lorsque tu demandes de l’aide sur un code, c’est plus simple à lire…

        Je vois pas où est l’erreur dans ton code (ça ne veut pas dire qu’il y en ait pas :)

      • [^] # Re: Bonjour

        Posté par  . Évalué à 3.

        Sinon pour la cohérence c'est simplement qu'il peut me donner 11ms pour un select très simple avec index et qui retourne 1 résultat et 12ms pour une requete avec 15 jointure sans index qui retourne 15000 résultat

        Tu es sûr que ta requête s’exécute bien ? Pas de message d’erreur si tu vires > /dev/null 2>&1

        ?

      • [^] # Re: Bonjour

        Posté par  (site web personnel) . Évalué à 1.

        As-tu activé le query cache ? Si oui c'est normal que tu n'aies pas de variation.

        • [^] # Re: Bonjour

          Posté par  . Évalué à 1.

          malgré le SQL_NO_CACHE?

          • [^] # Re: Bonjour

            Posté par  . Évalué à 3. Dernière modification le 18 octobre 2016 à 16:13.

            À propos de SQL_NO_CACHE :

            http://stackoverflow.com/questions/181894/mysql-force-not-to-use-cache-for-testing-speed-of-query

            This will stop MySQL caching the results, however be aware that other OS and disk caches may also impact performance. These are harder to get around.

            C’est une chose. Ensuite.

            Le fait que tu es beaucoup de résultats ne change presque rien au temps d’exécution vu que tu n’écris les résultats nulle part…

            Vérifies tes requêtes avec : https://dev.mysql.com/doc/refman/5.5/en/execution-plan-information.html

            Peut-être que le moteur utilise des index (internes, automatiques…) pour simplifier tes jointures de vandale…

            2>&1

            Pourquoi ? Il me semble que ta commande mysql ne devrait rien renvoyer sur stderr en temps normal, donc pourquoi te passer d’éventuels messages d’erreur ?

            Également, est-ce que les tables sur lesquelles tu fais tes requêtes sont conséquentes en nombres d’enregistrements ? Pour benchmarker des requêtes il vaut mieux des tables bien remplies…

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.