7 votes

Comment tester la vitesse des requêtes MySQL, avec moins d'incohérences ?

J'ai besoin d'un moyen simple pour tester la vitesse des requêtes SQL. Je ne suis pas trop préoccupé par les différences matérielles, j'ai essentiellement besoin d'un chiffre relatif.

C'est ce que j'ai fait avec PHP (c'est flou, mais ça marche) :

// CONNECT TO DB HERE

$sub = new YomoSubscription(95,783);

$t = microtime(TRUE);

// contains the SQL db call i'm testing
$fp = $sub->generateFingerprint(); 

echo microtime(TRUE)-$t;

En PROBLÈME Je constate que, parfois, lors de la première connexion/exécution, mon test prend 1,25 seconde, par exemple. Cependant, lors des connexions suivantes, il prend 0,004 seconde... Pourquoi cette ?

Je suis presque sûr que le cache de requête MySQL est désactivé dans my.ini :

query_cache_size=0

8voto

Andreas Bonini Points 15709

Essayez d'utiliser SELECT BENCHMARK(times, query)

Plus d'informations : http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_benchmark

4voto

Frank Farmer Points 16159

Votre première requête peut être plus lente parce que MySQL frappe le disque lors de la première requête, et non lors de la seconde.

Votre système d'exploitation peut mettre les fichiers en mémoire cache au fur et à mesure qu'ils sont lus ; par conséquent, les lectures suivantes n'ont pas besoin d'aller sur le disque et reviennent beaucoup plus rapidement.

En règle générale, je lance une requête plusieurs fois et je recherche la cohérence. Le plus souvent, la première exécution prend plusieurs fois plus de temps, tandis que la deuxième, la troisième et la quatrième prennent à peu près le même temps. Ces exécutions ultérieures sont probablement plus représentatives du type de performance que vous verrez sur un système de production réel - puisque votre base de données de production devrait conserver ces données dans le cache du système d'exploitation, alors que votre système de développement est rarement consulté.

En fin de compte, lorsqu'il s'agit de la performance des requêtes, il est préférable de donner un coup de pouce au développement et de surveiller le journal des requêtes lentes en production pour voir quelles requêtes vraiment nécessitent des travaux.

En ce qui concerne l'exécution programmatique de requêtes pour obtenir des données sur les performances, il convient de prendre plusieurs échantillons et d'utiliser la médiane. Mais en pratique, cela ne sera pas très représentatif des problèmes de performance que vous rencontrerez en production.

4voto

Toto Points 1173

Supposons que :

  1. vous n'utilisez pas de connexion persistante
  2. la base de données installée sur le serveur où les statistiques sont réalisées (pas de connexion réseau)
  3. personne d'autre n'utilise la base de données (verrouillage des lignes/tables)
  4. aucun autre processus lourd n'est en cours
  5. etc....

Si vous voulez vraiment comparer votre requête, vous devez faire ce qui suit :

$database->query('SET SESSION query_cache_type = OFF');

Ensuite, vous exécutez la requête 2 ou 3 fois en boucle (pour "chauffer" le serveur).

Et seulement à ce moment-là :

$database->query('FLUSH STATUS'); #If you use the stats to profile your query

$t = microtime(TRUE);
$fp = $sub->generateFingerprint();
echo microtime(TRUE)-$t;

$database->query('SHOW STATUS');

Et voilà ! :)))

BTW, la vitesse d'interrogation est l'un des paramètres de la lecture. Apprenez à lire les informations très précieuses renvoyées par SHOW STATUS y EXPLAIN ... . Ce sera beaucoup mieux.

Voici un lien que vous allez adorer : http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/

Appréciez. :)

0voto

Byron Whitlock Points 29863

Il se peut que vous utilisiez des connexions persistantes dans votre classe. Un pconnect réutilisera la connexion et tiendra compte de ce type de décalage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X