Le but ici est de comparer les types de tables MyISAM et InnoDB. Pour cela, nous avons pris une base de test que nous avons remplie au fur à et mesure avec du texte aléatoire, jusqu’à obtenir 1 000 000 d’enregistrements. C’est à partir de cette base que nous avons effectué les tests.
Pour commencer, voici donc le temps nécessaire pour remplir une base :
Table | Enregistrements | Temps |
MyIsam | 100 000 | 72sec |
InnoDB | 100 000 | >2min |
MyISAM | 20 000 | 1.43 sec |
InnoDB | 20 000 | 105 sec |
C’est indiscutable, InnoDB semble plus lent pour l’insertion des données. Et pourquoi donc ?! Il faut savoir que InnoDB est de type transactionnelle alors que MyISAM est (on s’en doute un peu) non-transactionnelle. Bon… Et ?! Ca veux dire quoi au juste ces termes barbares ?!
Les tables non-transactionnelles sont plus rapide, utilisent moins d’espace disque et moins de mémoire. Alors pourquoi choisir InnoDB ?! Car les tables transactionnelles sont plus sûr (en cas de crash de MySQL, vous pouvez tout de même récupérer vos données) et pour d’autres petits détails qui sortent un peu de cet article.
Les tables contiennent 4 champs :
Champ | Type |
Id | bigint |
Nom | varchar(30), null autorisé |
Prenom | varchar(30) , null autorisé |
Age | Tinyint |
Alors, nous voilà avec une table de 1 000 000 enregistrements (lignes) et nous allons pouvoir commencer les premiers tests. Juste pour info, voilà la place occupée par les différentes tables utilisées pour les tests (estimation de PhpMyAdmin, après optimisation) :
table | index sur Nom | Taille pour VACHAR(30 | Taille pour CHAR(30) |
MyISAM | non | 56.4Mo | 194.9Mo |
InnoDB | non | 60.6Mo | 93.6Mo |
MyISAM | oui | 61.8Mo | 202Mo |
InnoDB | oui | 104.2Mo | 168.4Mo |
On constate que InnoDB ne prend pas forcément plus de place que MyISAM. Mais cela tient surtout aux choix de stockage des données si vous choisissez plutôt CHAR que VARCHAR par exemple. Il faut bien garder à l’esprit que CHAR va allouer la taille indiqué (ici 30) quelque soit la quantité d’information stockée alors que VARCHAR va allouer la taille de l’information stockée (plus un reliquat pour indiqué la fin).
CHAR peut s’avérer plus rapide sur des tailles importantes (à partir de 100), mais n’a pratiquement aucune incidence en dessous.
Dans tous les tests que nous avons fait, le terme recherché, que ce soit un chiffre ou des lettres, est changé à chaque itération afin de ne pas récupérer un résultat dans un cache. Car, en effet, si MySQL reçoit une requête déjà effectuée, cette seconde requête (et les suivantes) est nettement plus rapide. La recherche est lancée plusieurs fois et le temps affiché est une moyenne. Les tests ont été relancés plusieurs fois à différents moments pour être certain que rien ne pouvait interférer sur les résultats.
Les tests
SELECT * FROM MaTable WHERE Age>45
Table | Résultat |
MyISAM | 1.370 |
InnoDB | 2.376 |
InnoDB est plus lent sur une requête simple.
SELECT * FROM MaTable WHERE Nom=’dummy’
Table | Résultat |
MyISAM | 0.504 |
InnoDB | 1.382 |
SELECT * FROM MaTable WHERE Nom<>‘dummy’
Table | Résultat |
MyISAM | 1.996 |
InnoDB | 3.163 |
La recherche par différence est plus longue que l’égalité.
SELECT * FROM MaTable WHERE Nom LIKE ‘xyz%’
Table | Résultat |
MyISAM | 0.512 |
InnoDB | 1.282 |
Aussi étonnant que cela puisse sembler, ici le temps est pratiquement le même pour une égalité pour un LIKE. Notons également que le temps reste le même si les données sont du type CHAR(30) ou VARCHAR(30).
SELECT * FROM MaTable WHERE Nom LIKE ‘xyz%’ ORDER BY Age
Table | Résultat |
MyISAM | 0.484 |
InnoDB | 1.409 |
Nous rajoutons un tri à la recherche. Du coup, InnoDB augmente un peu son temps alors que MyISAM le réduit.
Attention, maintenant, nous allons faire exactement la même requête, mais en ajoutant un index sur le champs Nom. Et là, vous allez voir que ce n’est pas négligeable d’y penser :
SELECT * FROM MaTable WHERE Nom LIKE ‘xyz%’ ORDER BY Age
Table | Résultat |
MyISAM | 0.0005 |
InnoDB | 0.002 |
Conclusion
Pas simple de conclure avec ces chiffres. Disons que si vous avez des informations importantes à stocker et que vous avez beaucoup d’utilisateurs qui vont faire des écritures simultanées dans votre base, il vaut peut-être mieux choisir InnoDB.
Si vous faites beaucoup de lecture de données et peu d’écriture, le choix doit se porter sur MyISAM.
Mettre un index sur un champs permet d’augmenter considérablement la vitesse lors d’une requête, mais augmente aussi la taille de la base. Faites donc attention surtout si vous êtes sur un serveur mutualisé.
Un dernier mot : il existe d’autres type de tables pour MySQL. Notamment les tables MEMORY. Mais ce type ne peut-être utilisé pour des tables de cette taille sans avoir une quantité de mémoire très importante. Nous effectuerons très certainement des tests dans un prochain article.
Commentaires récents