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.
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.
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..
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 ? :-)
En effet il y avait une coquille, merci de l’avoir relevée. La requête SQL a été modifiée.
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 ?
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 !
“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