Tests de performances de requêtes SQL - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38) +--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51) +--- Sujet : Tests de performances de requêtes SQL (/showthread.php?tid=5338) |
Tests de performances de requêtes SQL - Argorate - 31-03-2011 Bonjour, Je voudrais vous faire partager un constat des plus étrange, sans vouloir créer de polémique, j'aurais aimé qu'on puise discuter de ces observations. En effet j'ai tester et comparer 4 moyens différents d'exécuter des requêtes SQL afin de savoir laquelle seraient la meilleure méthode d'un point de vue performance. Les différentes methodes Pour parler concrètement, j'ai tester les quatre méthodes suivante:
Avec pour les méthodes de requêtes préparer, ceci en plus : (executer juste après la connexion à la bdd) (exécuter qu'une seule fois avant le début de la boucle, voilà pourquoi elle ne sont pas dans les fonctions ci-dessus)
J'ai effectuer les tests sur plusieurs série de requête: En Lecture : SELECT de tous (sans WHERE) En Lecture : SELECT d'un élément (avec WHERE sur un id) En Écriture : INSERT Et ce sur une table MyISAM, puis InnoDB. Les test sur 100 000 boucles sur des select étant trop long, j'ai majoritairement du me contenter de 10 000, mais je pense que c'est amplement suffisant pour voir apparaitre l'ordre de grandeur. Résultats : Code : MyISAM Donc j'avoue ne pas comprendre pourquoi les requêtes préparer, qui comme leur nom l'indique sont censé être préparer et plus rapide, sont ici beaucoup plus lente que les versions "normales"?? Je me demande s'il n'y a pas des mécanismes interne qui fausse ces résultats? Quelqu'un pourrait m'éclairer peut être? Sinon, que pensez-vous du fait que mysql_query > pdo? Quel conclusion en prendre? Et surtout, au final, que choisir? En espérant que le débat restera ouvert. RE: [Test Performence] Requetes SQL - Anthor - 31-03-2011 C'est comme une pizza surgelé, c'est plus rapide à manger mais pas forcement de meilleure qualité... RE: [Test Performence] Requetes SQL - Argorate - 31-03-2011 Oui, enfin, ce n'est pas une petite différence a certains endroit... Es-ce vraiment à négliger? RE: [Test Performence] Requetes SQL - Anthor - 31-03-2011 Je ne peux rien dire, vu que tu ne fournis rien ^^ Dans quelles conditions fais-tu ton test ? Avec quelle plateforme ? Les 4 à la suite à l'arrache ? Sous windows (HAHAHAHA) ? RE: [Test Performence] Requetes SQL - Argorate - 31-03-2011 J'ai fais ça en local, avec wamp sur un windows XP et les 4 à la suite J'ai rien à cacher, mon but est de comprendre... ^^ Cependant même si les conditions ne sont pas optimale, puisqu'elles sont les même pour chaque test, tout les écarts possible sont ajouter à chaque test, donc au final la différence reste la même. EDIT: C'est bon j'ai compris pourquoi ces résultats ne me semblait pas cohérent, petite erreur d'étourderie, j'arrange ça et je met à jour (le temps de refaire les tests ^^) EDIT2: code déplacer dans le premier topic et corrigé. RE: [Test Performence] Requetes SQL - niahoo - 31-03-2011 Ben déjà pourquoi tu calcules le temps à chaque itération. il faut le mettre à l'intérieur de ton while. Si c'est juste pour éviter de calculer le temps de passage en paramètre du PDOStatement, je te conseille de faire un benchmark plus simple. là, l'intérêt de jouer sur les noms de tes méthodes et de parcourir un tableau c'est bien joli mais ça rend tout le test illisible. RE: [Test Performence] Requetes SQL - Argorate - 31-03-2011 J'ai presque fini de refaire les tests sans ma bourde. Me manque plus qu'un résultat. J'éditerais en début d'aprem, les résultats semble beaucoup plus parlant! vive les requêtes préparer :roll: Sinon, je calcule le temps uniquement de l'instruction que je veux tester, voilà pourquoi j'ai mis les microtime() dans chacune des fonctions, encadrant l'instruction qui lance la requête SQL. Au moins je ne perds pas quelques microseconde avant ou après, comme se serait le cas si je m'étais ça dans la boucle. (au final ça revient au même, c'est juste plus rigoureux à mon sens). Après la lisibilité du truc n'était pas vraiment recherché, j'ai fait ça pour moi^^ Ce qui m'intéresse c'est les résultats, et les potentiels conclusion. Cependant je ne vois pas ce qu'il y a de compliqué dans l'exécution du code que j'ai mis, c'est le fait de placer le nom de la fonction dans une variable qui te gène? RE: [Test Performence] Requetes SQL - Sephi-Chan - 31-03-2011 Ce n'est pas comme ça qu'on mène des tests. Mieux vaut utiliser 4 scripts, lancés séparément (et donc dans des processus différents) et avec un peu de temps entre chaque (que la machine revienne à son état initial). Ça donne des résultats plus justes. Sur un OS Unix, il y a une commande time qui peut être utile :
D'ailleurs, il faudrait tester ça sur un OS Unix, car c'est bien ce genre d'environnement qu'on utilise en production avec PHP, pas du Windows. Même s'il n'y a pas de différence ou qu'elles sont sensibles, c'est plus intelligent. Sephi-Chan RE: [Test Performence] Requetes SQL - Anthor - 31-03-2011 J'ajoute aussi à ce qu'à dit mon jambon, que MySQL windows c'est loin d'être une bête... Suffit de profiler sous windows et sous linux pour voir l'"énorme" différence ! Un serveur qui ne fait que ça, ce n'est pas un OS utilisateur ^^ RE: [Test Performence] Requetes SQL - niahoo - 31-03-2011 (31-03-2011, 12:08 PM)Argorate a écrit : Cependant je ne vois pas ce qu'il y a de compliqué dans l'exécution du code que j'ai mis, c'est le fait de placer le nom de la fonction dans une variable qui te gène? Ce qui me gène c'est que le test n'est pas clair. généralement tu fais un script par test et tu les inclus dans ton benchmark pour les lancer. (Mais la méthode proposée par sephi me parait plus intéressante). Bon c'est pour chipoter car les 4 méthodes se tiennent de près. Parfois tu as plusieurs méthodes candidates pour traiter un problème qui seront très différentes. c'est bien d'avoir un test clair qui te montre toute la méthode. Par exemple, si je testais PDO, je mettrais la préparation de la requête dans la boucle. (Toi tu l'additionnes ensuite ce qui revient au même techniquement mais pas logiquement). si tu inclus une librairie ça compte aussi, etc. |