Quelle est la différence entre InnoDB et MyISAM?


17

J'utilise MySQL comme base de données pour mon projet Web actuel. Je suis nouveau sur MySQL. Veuillez m'expliquer la différence entre InnoDB et MyISAM.


n'hésitez pas à ajouter un tag MySQL également :)
Johan

Cela n'appartient-il pas à stackoverflow?
ripper234

@ ripper234. Il existe deux meilleures versions de cet article (bien plus de contexte; plus de démonstration de recherches antérieures) sur SO: stackoverflow.com/q/12614541/209139 et stackoverflow.com/q/20148/209139 .
TRiG

Réponses:


14

ISAM = Indexed Sequential Access Method et est essentiellement un fichier plat (pour les DBA qui peuvent se souvenir, pensez Btrieve ou B-Tree). C'est une technologie très ancienne - mais ne vous laissez pas décourager de l'utiliser. Parce que c'est un fichier plat (plus à ce sujet plus tard), il n'est pas relationnel, et n'est donc pas un SGBDR, et est donc plus approprié dans certaines situations.

InnoDB est le SGBDR complet comme vous le connaissez probablement. MyISAM peut sembler être relationnel via une autre couche ajoutée en haut qui maintient vos liens, votre logique et votre intégrité référentielle.

ISAM est génial si vous avez BEAUCOUP d'enregistrements (comme 20 millions), et les enregistrements sont pour la plupart autonomes (c'est-à-dire que vous n'avez pas besoin de faire beaucoup de liens pour récupérer les données associées). Il s'appuie TRÈS lourdement sur les index et si vous n'avez pas le bon index, soyez prêt pour des temps de requête très très longs. Exemple: nous avions une table Btrieve ISAM avec plus de 20 millions d'enregistrements et effectuer une récupération et filtrer les données sur la base d'un index précis était presque instantané. Utiliser le mauvais index était littéralement de 15 minutes.

InnoDB est idéal si vous avez beaucoup de liens relationnels. Le tableau A fait référence à un champ du tableau B, qui fait référence aux tableaux C et D. InnoDB peut récupérer ces enregistrements à l'aide de toutes sortes de jolies méthodes de jointure (jointures de hachage, etc.), tandis qu'une base de données ISAM devrait exécuter plusieurs sous-requêtes pour chaque single. ligne et faire correspondre les enregistrements manuellement.

Il vous faudra vraiment suivre un cours de bases de données si vous voulez bien plus de détails que ça!


ISAM est tout aussi relationnel qu'autre chose, il n'est tout simplement pas optimisé pour cela.
LapTop006

merci 4 votre brève description. Maintenant, fondamentalement, je suis autorisé

5

Le plus fondamental est qu'InnoDB est transactionnel. MyIsam ne l'est pas. MyIsam est généralement un peu plus rapide, donc si vous n'avez pas besoin de transactions, c'est généralement votre meilleur pari. Pour des descriptions détaillées, vous devriez lire la documentation MySQL.


2

De nos jours, à moins que vous n'utilisiez une table pour les données de style de journal (beaucoup plus d'insertions que de sélections, aucune transaction) InnoDB est généralement plus rapide, plus fiable, a plus de fonctionnalités, etc.

La seule autre fonctionnalité de MyISAM est la recherche plein texte, ce qui est bien pour une utilisation de base, mais la plupart des gens en utilisent de Lucene pour quelque chose de sérieux.

Dans tous les cas, vous devez régler MySQL car les valeurs par défaut sont essentiellement définies pour un pentium de 32 Mo partagé avec d'autres services.


2

Un peu tard dans le jeu ... mais voici un article assez complet que j'ai écrit il y a quelques mois , détaillant les principales différences entre MYISAM et InnoDB. Prenez une tasse de thé (et peut-être un biscuit) et dégustez.


La principale différence entre MyISAM et InnoDB réside dans l'intégrité référentielle et les transactions. Il existe également d'autres différences telles que le verrouillage, les restaurations et les recherches de texte intégral.

Intégrité référentielle

L'intégrité référentielle garantit que les relations entre les tables restent cohérentes. Plus précisément, cela signifie que lorsqu'une table (par exemple, les listes) a une clé étrangère (par exemple, l'ID de produit) pointant vers une table différente (par exemple, les produits), lorsque des mises à jour ou des suppressions se produisent dans la table pointée, ces modifications sont répercutées en cascade sur la liaison table. Dans notre exemple, si un produit est renommé, les clés étrangères de la table de liaison seront également mises à jour; si un produit est supprimé du tableau «Produits», toutes les listes qui pointent vers l'entrée supprimée seront également supprimées. En outre, toute nouvelle liste doit avoir cette clé étrangère pointant vers une entrée existante valide.

InnoDB est un SGBD relationnel (RDBMS) et a donc une intégrité référentielle, contrairement à MyISAM.

Transactions et atomicité

Les données d'une table sont gérées à l'aide d'instructions DML (Data Manipulation Language), telles que SELECT, INSERT, UPDATE et DELETE. Une transaction regroupe deux instructions DML ou plus en une seule unité d'oeuvre, de sorte que l'unité entière est appliquée, ou rien de tout cela.

MyISAM ne prend pas en charge les transactions, contrairement à InnoDB.

Si une opération est interrompue lors de l'utilisation d'une table MyISAM, l'opération est immédiatement abandonnée et les lignes (ou même les données de chaque ligne) qui sont affectées restent affectées, même si l'opération ne s'est pas terminée.

Si une opération est interrompue lors de l'utilisation d'une table InnoDB, parce qu'elle utilise des transactions, qui ont l'atomicité, toute transaction qui ne s'est pas terminée ne prendra pas effet, car aucune validation n'est effectuée.

Verrouillage de table vs verrouillage de ligne

Lorsqu'une requête s'exécute sur une table MyISAM, la table entière dans laquelle elle interroge sera verrouillée. Cela signifie que les requêtes suivantes ne seront exécutées qu'après la fin de la requête en cours. Si vous lisez un grand tableau et / ou qu'il y a des opérations de lecture et d'écriture fréquentes, cela peut signifier un énorme arriéré de requêtes.

Lorsqu'une requête s'exécute sur une table InnoDB, seules les lignes impliquées sont verrouillées, le reste de la table reste disponible pour les opérations CRUD. Cela signifie que les requêtes peuvent s'exécuter simultanément sur la même table, à condition qu'elles n'utilisent pas la même ligne.

Cette fonctionnalité dans InnoDB est connue sous le nom de simultanéité. Aussi grande que soit la concurrence, il existe un inconvénient majeur qui s'applique à une plage sélectionnée de tables, en ce sens qu'il y a un surcoût lors du basculement entre les threads du noyau, et vous devez définir une limite sur les threads du noyau pour empêcher le serveur de s'arrêter. .

Transactions et annulations

Lorsque vous exécutez une opération dans MyISAM, les modifications sont définies; dans InnoDB, ces modifications peuvent être annulées. Les commandes les plus courantes utilisées pour contrôler les transactions sont COMMIT, ROLLBACK et SAVEPOINT. 1. COMMIT - vous pouvez écrire plusieurs opérations DML, mais les modifications ne seront enregistrées que lorsqu'un COMMIT est effectué 2. ROLLBACK - vous pouvez ignorer toutes les opérations qui n'ont pas encore été validées 3. SAVEPOINT - définit un point dans la liste des opérations auxquelles une opération ROLLBACK peut revenir en arrière

Fiabilité

MyISAM n'offre aucune intégrité des données - Les pannes matérielles, les arrêts impurs et les opérations annulées peuvent entraîner la corruption des données. Cela nécessiterait une réparation complète ou des reconstructions des index et des tables.

InnoDB, d'autre part, utilise un journal des transactions, un tampon de double écriture et une somme de contrôle et une validation automatiques pour éviter la corruption. Avant qu'InnoDB n'apporte de modifications, il enregistre les données avant les transactions dans un fichier d'espace disque logique système appelé ibdata1. En cas de plantage, InnoDB récupère automatiquement via la relecture de ces journaux.

Indexation FULLTEXT

InnoDB ne prend pas en charge l'indexation FULLTEXT jusqu'à MySQL version 5.6.4. Au moment de la rédaction de cet article, la version MySQL de nombreux hébergeurs partagés est toujours inférieure à 5.6.4, ce qui signifie que l'indexation FULLTEXT n'est pas prise en charge pour les tables InnoDB.

Cependant, ce n'est pas une raison valable pour utiliser MyISAM. Il est préférable de passer à un fournisseur d'hébergement qui prend en charge les versions à jour de MySQL. Non pas qu'une table MyISAM qui utilise l'indexation FULLTEXT ne peut pas être convertie en une table InnoDB.

Conclusion

En conclusion, InnoDB devrait être votre moteur de stockage par défaut de choix. Choisissez MyISAM ou d'autres types de données lorsqu'ils répondent à un besoin spécifique.


1

En règle générale, si vous voulez de la vitesse, utilisez MyISAM et si vous voulez de la stabilité, utilisez InnoDB. Quelque chose à voir avec l'atomicité si je me souviens bien.


3
Sauf que ce n'est plus vrai, InnoDB est en fait plus rapide dans la plupart des cas.
LapTop006

1
quelqu'un peut-il ajouter un lien des repères ou quelque chose ...?
Johan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.