background success stories

MyISAM Vs InnoDB

Un moteur de stockage est constitué d’algorithmes qui seront utilisés par le Système de Gestion de Base de Données Relationnelles pour enregistrer les données et les récupérer au moyen de requêtes SQL qui seront exécutées sur le système, elles-mêmes intégrées dans des transactions. Il faut savoir que MySQL propose plusieurs moteurs de stockages, ce qui diverge d’un grand nombre de concurrents qui n’en proposent qu’un seul. Ainsi, dans MySQL, les administrateurs système et les développeurs ont la possibilité de faire le choix du moteur qui sera le plus performant selon eux pour une action donnée.

Voici les principaux moteurs de stockage actuels de MySQL :

  • MyISAM
  • InnoDB
  • MERGE
  • MEMORY
  • BLACKHOLE
  • ARCHIVE
  • FEDERATED

 

MyISAM est le moteur par défaut dans les versions de MySQL inférieures à 5.5 et ce, depuis la version 3.23. MyISAM est un moteur non-transactionnel ce qui explique qu’il est rapide (surtout en lecture). Il faut noter qu’il ne gère ni les relations, ni les transactions. C’est un moteur qui perd énormément en intégrité à cause des points précédents, en revanche il gagne de la vitesse.

Une table utilisant MyISAM est verrouillée en lecture et en écriture si un utilisateur est en train d’écrire des données. Ainsi, il faudra attendre que l’écriture soit terminée pour pouvoir écrire de nouveau.

MyISAM est également un moteur gérant l’indexation des contenus, et permet de créer des index de type FULLTEXT sur des champs de type TEXT. Cela a pour but de rendre une recherche plus rapide et efficace que nos recherches habituelles avec « LIKE ». Ainsi si vous souhaitez rechercher des données, c’est un moteur à privilégier.

MyISAM est plus rapide sur la lecture d’une seule table. InnoDB est le plus performant dès lors qu’il y a des jointures à réaliser. En environnement professionnel, il est rare d’utiliser des requêtes sans jointures.

Les avantages :

  • Très rapide pour les requêtes de type SELECT ou INSERT
  • Il supporte les index fulltext : permet d’effectuer des recherches sur des mots en se basant sur un index spécifique, accélérant ainsi les recherches
  • Il gère les conflits d’accès (ou lock) : permet de verrouiller une table pour des opérations bien précises
  • Très facile à administrer : possibilité de recopier directement les fichiers d’un serveur vers un autre, support des tables compressées…

Les inconvénients :

  • Il ne supporte pas les transactions
  • Il ne supporte pas les clés étrangères

 

InnoDB est apparu par la suite ; la plus importante différence avec MyISAM est qu’InnoDB est un moteur relationnel : il permet de créer des contraintes d’intégrité, tout comme d’autres SGBD comme PostgreSQL, SQL Server ou Oracle. Ainsi, l’utilisateur est certain que les relations entre les tables sont cohérentes et que les changements effectués sur les données contenues dans ces tables seront transmis aux tables qui y sont liées.

MyISAM et InnoDB ont sensiblement la même performance en lecture, par contre en écriture, InnoDB est plus lent que MyISAM (même si cet écart de vitesse a été réduit lors de la version 5.5 de MySQL). De plus, les données stockées avec InnoDB occupent plus de place sur le disque que MyISAM.
Toujours concernant les performances, InnoDB consomme plus de mémoire mais fait beaucoup moins d’I/O, pour rappel MyISAM ne met en cache que les index, du coup en dehors de cela, il n’y a que des accès disques et les performances en lecture hors index sont plutôt mauvaises.

InnoDB offre une bonne sécurité en ce qui concerne la validité des données et est donc un moteur fortement conseillé pour stocker des données relationnelles ou nécessitant des transactions classiques.

Les avantages :

  • Il supporte ACID : permet d’assurer que chaque enregistrement sera complètement réussi, ou complètement échoué, ainsi les risques d’erreurs sont impossibles, même en cas de panne
  • Il gère les transactions (instructions sql BEGIN, COMMIT, ROLLBACK…)
  • Il supporte les clés étrangères et les intégrités référentielles
  • Il possède un système de récupération automatique en cas de crash

Les inconvénients :

  • Il ne permet pas d’index fulltext (sauf dans les versions récentes)
  • Son administration est un peu plus complexe (gestion de tablespace, paramètres supplémentaires dans le my.cnf…)
  • Le moteur de stockage est parfois plus lent que d’autres et gourmand en ressources mémoires
  • InnoDB prend de 1,5 à 2 fois la place qu’occupe une table MyISAM, ce qui n’est pas négligeable dans certains cas

 

L’utilisation de MyISAM ou InnoDB dépend avant tout de l’application. Des tests de charge sont à prévoir pour en faire la démonstration.

Nous pouvons tout de même croire que MyISAM serait voué à disparaître à court terme. Il existe aujourd’hui de très rares usecases où MyISAM est meilleur.

Attention également avec MyISAM, ce moteur est sujet à ce qu’on appelle des corruptions silencieuses qui ne sont pas évoquées et qui peuvent être découvertes des années plus tard dans certains cas.

Selon certains, MyISAM serait un moteur à rayer du vocabulaire MySQL, car il est dangereux et la plupart des avantages de MyISAM sont aujourd’hui devenus obsolètes.