[MySQL] MyISAM ou InnoDB ?

MySQL enregistre par défaut les informations avec le moteur de stockage MyISAM, mais il en existe d’autres incluant InnoDB (le plus connu), ISAM, Heap, NBD, Berkeley DB ou encore Merge. Le choix d’un moteur de stockage est important et les différents parfois méconnue. Cet article présente les principales différences entre MyISAM et InnoDB pour comprendre comment faire ce choix.

Logo MySQL

Logo MySQL

MyISAM

Avantages

Voici une liste non-exhaustive d’arguments en faveurs de MyISAM:

  • Système de stockage par défaut de MySQL. Ce type de stockage est le plus ancien disponible avec MySQL
  • Très rapide pour effectuer des requêtes SELECT ou INSERT
  • Supporte l’indexation plein texte (cf. index full text). Offre de bien meilleure performance lors d’une recherche sur des champs de textes
  • Administration plus simple
  • Possibilité de verrouiller au niveau d’une table (cf. table lock)
  • Plus souple au niveau de l’intégrité des données (mais ça peut avoir son revers de la médaille …)

Inconvénients

La souplesse de MyISAM entraîne quelques points négatifs lorsqu’il s’agit de garder une bonne intégrité des données, comme le montre les points ci-dessous:

  • Pas de transactions
  • Pas de clés étrangères
  • Plus difficile de récupérer après un crash. L’intégrité des données peut facilement être compromise

 Passer à MyISAM

Si vous souhaitez passer une table à MyISAM il suffit simplement d’exécuter cette requête SQL:

ALTER TABLE `table` ENGINE=MYISAM;

InnoDB

Avantages

Les principaux avantages d’utiliser InnoDB concerne la possibilité de bien gérer l’intégrité des données, même lors d’un crash du serveur.

  • Gère les transactions (ensemble de requêtes regroupées) tel que BEGIN, COMMIT, ROLLBACK …
  • Gère les clés étrangères et les contraintes d’intégrité
  • Support de ACID pour s’assurer que tous les enregistrements sont réussi ou échoué. Risque d’erreur impossible, même lors d’une panne
  • Système de récupération lors d’un crash grâce à un système de relecture des logs

Inconvénients

Toutefois, l’intégrité des données complique l’administration d’une base de données.

  • Plus strict concernant l’intégrité des données
  • Ne supporte pas l’indexation plein texte (cf. index full text)
  • Administration un peu plus complexe
  • Moteur de stockage plus imposant. Il demande plus de ressources et est plus lent
  • Possibilité de verrouiller au niveau d’une ligne (cf. row lock) pour insérer ou mettre à jour un enregistrement
  • Intéressant de noter que c’est plus récent, même si ce n’est pas forcément un inconvénient

Passer à InnoDB

Pour passer une table à InnoDB il suffit de lancer la requête suivante:

ALTER TABLE `table` ENGINE=InnoDB;

Info bonus

Il est important de savoir qu’il est possible dans une même base de données d’avoir des tables en MyISAM et d’autres en InnoDB. Cela permet même d’améliorer les performances dans certains cas.

Conclusion

Pour résumer sur le choix entre InnoDB et MyISAM :

  • MyISAM : à privilégier lorsqu’il est surtout nécessaire d’effectuer des requêtes pour lire ou insérer des données. Pour des sites web, c’est souvent la solution recommandée.
  • InnoDB : à privilégier pour les systèmes qui ne doivent pas comporter d’erreurs et qui nécessite des clés étrangères. Pour une application gérant des données importantes, tel une application bancaire, cela peut se révéler le moteur de stcokage recommandé.

Si vous souhaitez connaître avec plus de précisions les différences il faut bien entendu se rendre sur la documentation officielle. N’hésitez pas non plus à partager vos connaissances et expériences dans les commentaires de cet article.

Ce contenu a été publié dans Autres.

A propos de l'auteur : Tony Archambeau

Fort de plusieurs années d’expérience dans le développement web, Tony partage ses connaissances sur des projets divers dont le site infowebmaster.fr.
Il est possible de le suivre sur Twitter.

Partager

6 réflexions au sujet de « [MySQL] MyISAM ou InnoDB ? »

  1. error500 dit :

    Merci pour cette info qu’il serait intéressant de croiser avec les versions de MySQL.
    Tu as certainement laissé une coquille en revanche sur l’ordre SQL de passage à innoDB..

  2. Ph3nIx dit :

    Passer à InnoDB
    Pour passer une table à InnoDB il suffit de lancer la requête suivante:

    ALTER TABLE `table` ENGINE=MYISAM; >>>> ???? AH BON ? je pense que c’est une erreur du copier coller, hein ? :-)

  3. Tony Archambeau dit :

    En effet il y avait une coquille, merci de l’avoir relevée. La requête SQL a été modifiée.

  4. Djerfy dit :

    Hello,

    Erreur de copié / coller car on la retrouve plus haut dans l’article :)

    Il serait aussi intéressant je pense de rajouter une requête pour lister les database.table qui sont dans ce format MyISAM :
    =====
    use information_schema;

    SELECT TABLE_SCHEMA AS « Nom de la base », TABLE_NAME AS « Nom de la table » FROM `TABLES` WHERE ENGINE LIKE ‘myisam’;
    =====

    Qu’en pense tu ?

  5. Tony dit :

    I think just on one condition you should consider using MYISAM over INNODB, and that’s when you want to use the table as a log file !

  6. Nyx dit :

    « Possibilité de verrouiller au niveau d’une ligne (cf. row lock) pour insérer ou mettre à jour un enregistrement »

    Est-ce vraiment un inconvénient ? Pas toujours a mon avis

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *