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 GuieA_7 (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 gotcha5832 . Évalué à 1.
ouais mais c'est sur un serveur
[^] # Re: MySQL Workbench
Posté par GuieA_7 (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 paulez (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 Marotte ⛧ . Évalué à 2.
Je ne comprends pas à quoi sert la variable $i.
Tu pourrais nous les montrer (arguments passés au script et affichage obtenu) ? En quoi te semblent-ils incohérents ?
[^] # Re: Bonjour
Posté par gotcha5832 . É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 Marotte ⛧ . Évalué à 2. Dernière modification le 15 octobre 2016 à 17:37.
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 Marotte ⛧ . Évalué à 3.
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 paulez (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 gotcha5832 . Évalué à 1.
malgré le SQL_NO_CACHE?
[^] # Re: Bonjour
Posté par Marotte ⛧ . É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
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…
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.