Un des aspects de la gestion d'une base de données est celui de l'insertion d'enregistrements. Les méthodes mysql, mysqli, PDO et Doctrine ont leur spécifité pour l'ajout de ligne à une table. De plus, le type de champ, la quantité de donnée et les différentes indexations influent également sur les temps de traitement.
4 méthodes d'enregistrements de données seront testées ici : mysql, mysqli, PDO et Doctrine 1.2
Protocole
Les tests sont effectués sur une base de données mysql TEST contenant 2 champs : TEST_id (type INTEGER auto incrémenté) et TEST_data (types INTEGER ou VARCHAR(50) selon les cas).
La requête SQL pour l'ajout d'un enregistrement correspond à :
Dans le cas de l'ajout d'un entier composé de 8 chiffres :
"INSERT INTO TEST (TEST_data) VALUES (".$i.")"
Dans le cas de l'ajout d'une chaîne de caractères de 8 caractères de longueur :
"INSERT INTO TEST (TEST_data) VALUES ('".$i."')"
Pour que ne soient pris en compte que le temps de la requête d'insertion, un tableau d'insertion est créé avant la requête.
Les mesures de temps sont effectués selon le schéma suivant :
création du tableau des insertions;
connexion à la base;
mesure du temps 1;
requête d'insertion;
mesure du temps 2;
Chaque test est effectué 10 000 fois pour lisser les mesures et amoindrir l'impact des autres activités aléatoires de la machine.
Tests
1er test : insertion de 100 enregistrements d'un entier
Les tests d'insertion se font dans une table vide.
L'ORM Doctrine se révèle ici être la méthode la plus lente.
Pour clarifier le graphique, l'intervalle d'affichage a été réduit entre 0 et 20 ms pour afficher les différences de durée de traitement pour mysql, mysqli et PDO.
2ème test : insertion de 100 enregistrements d'une chaîne de caractères
Les tests d'insertion se font dans une table vide.
Pour clarifier le graphique, l'intervalle d'affichage a été réduit entre 0 et 24 ms pour afficher les différences de durée de traitement pour mysql, mysqli et PDO.
Premières conclusions
L'ORM Doctrine est 20 fois plus lent pour insérer des enregistrements. Les temps des 3 autres méthodes sont très proches. Néanmoins, sur les insertions d'une chaîne de caractères, PDO se révèle légèrement plus lent.
Ces tests ne révèlent les performances de chaque méthode que pour des tables initialement vides. Ce cas est relativement rare et est donc poursuivi par la reproduction des 2 premiers tests sur une table pré-remplie.
3ème test : insertion de 100 enregistrements d'un entier dans une table pré-remplie
Les tests d'insertion se font dans une table pré-remplie d'un million d'enregistrements.
L'ORM Doctrine se révèle ici être la méthode la plus lente.
Pour clarifier le graphique, l'intervalle d'affichage a été réduit entre 0 et 24 ms pour afficher les différences de durée de traitement pour mysql, mysqli et PDO.
La logique des résultats des tests précédents est respectée. Doctrine est toujours la méthode la plus lente. Les 3 autres méthodes effectuent le travail dans le même temps.
Par rapport au test 1, ces 3 méthodes nécessitent 2 millisecondes de plus soit une augmentation de 10%.
4ème test : insertion de 100 enregistrements d'une chaîne de caractères dans une table pré-remplie
Les tests d'insertion se font dans une table pré-remplie d'un million d'enregistrements.
L'ORM Doctrine se révèle ici être la méthode la plus lente.
Pour clarifier le graphique, l'intervalle d'affichage a été réduit entre 0 et 24 ms pour afficher les différences de durée de traitement pour mysql, mysqli et PDO.
Les résultats du test 2 sont similaires. Les 3 méthodes sont très proches même si PDO se est un peu plus lent comme lors du 2ème test. PDO nécessite plus de ressources pour gérer les insertions de chaînes de caractères. La différence par rapport à mysql et mysqli est ici de 3 millisecondes soit 12,5%.
Le temps supplémentaire pour les insertions sur une table pré-remplie est de 2 millisecondes soit une augmentation de 10%.
Conclusions
Quelque soit les types d'insertions (entier ou chaîne de caractères), Doctrine demande 20 fois plus de temps pour effectuer la même tâche.
Les performances de mysql, mysqli et PDO sont similaires.
Le travail sur une table non vide demande 10% de ressources supplémentaires.
PDO est plus lent que mysql et mysqli quand il s'agit d'insérer un chaîne de caractère.