URL: https://linuxfr.org/users/docteurcosmos/journaux/comparatif-performances-php-mysql-postgresql-sqlite Title: Comparatif performances PHP : MySQL / PostgreSQL / SQLite Authors: DocteurCosmos Date: 2005年11月27日T20:46:51+01:00 Tags: postgresql Score: 0 La dépêche parue il y a quelque temps concernant PostgreSQL m'a vivement intéressé (cf. [http://linuxfr.org/2005/11/09/19872.html](http://linuxfr.org/2005/11/09/19872.html) ). Une partie de la discussion a porté sur la qualité de ce SGBDR au sein d'un environnement web. C'est pourquoi j'ai voulu - à ma petite échelle - tenter un comparatif de performance avec PHP comme langage. Ayant sous la main une base utilisée en production sous MySQL 5.0.16, j'en ai extrait trois tables faisant sens entre elles et je les ai injectées dans PostgreSQL et SQLite. J'ai bien entendu recréé les index présents sur chaque table de la base d'origine. J'ai ensuite créé un script php testant les unes après les autres différentes requêtes par ordre croissant de 'complexité' avec à chaque fois l'envoi sur chaque moteur de la même requête. J'ai relancé plusieurs fois la page à coup de Ctrl + R répétés à intervalles variables pour m'assurer que les résultats étaient constants. Informations matérielles et logicielles : Plateforme matérielle : - Pentium 4 3.2Ghz - 1 Go RAM Plateforme logicielle : - Linux 2.6.12-12mdksmp #1 SMP Fri Sep 9 17:43:23 CEST 2005 i686 Intel(R) Pentium(R) 4 CPU 3.20GHz GNU/Linux - PHP 5.0.5 compilé - Apache 2.0.55 compilé - MySQL 5.0.16 compilé - Postgres 8.1 compilé Volumétrie de la base (en nombre d'enregistrements) : Table personne : 50946 Table structure : 3330 Table structure_type : 10 **Vous trouverez le schéma de la base, les requêtes exécutées et les résultats à la page : [http://docteur.cosmos.free.fr/tests.html](http://docteur.cosmos.free.fr/tests.html) ** Notes : - utilisation de connexions persistantes - tables en MyIsam pour MySQL - les temps d'exécution sont obtenus avec le code suivant (repiqué de phpmyadmin) : list($usec, $sec) = explode(' ',microtime()); $querytime_before = ((float)$usec + (float)$sec); // appel de pg_query ou mysql_query ou sqlite_query selon list($usec, $sec) = explode(' ',microtime()); $querytime_after = ((float)$usec + (float)$sec); $duree = sprintf ('%01.4f sec.', ($querytime_after - $querytime_before)); Quelques commentaires Les résultats sont assez surprenants. On aurait pu penser de prime abord qu'une API était plus aboutie qu'une autre mais les performances sont vraiment disparates... Voir par exemple la requête 6 en faveur de MySQL) ou encore la requête 1 (en faveur de PostgreSQL) avec des différences notables dans le temps d'exécution. Noter par ailleurs la requête 7 que PostgreSQL ne peut pas exécuter (restriction sur les colonnes ramenées et le Group By). Enfin, tout ça c'est bien sûr du mono utilisateur...