Maison > Article > base de données > Quelle est la différence entre MyISAM et InnoDB dans MySQL
Différences : 1. InnoDB prend en charge les transactions, mais pas MyISAM. 2. InnoDB prend en charge les clés étrangères, mais pas MyISAM. 3. InnoDB est un index clusterisé, tandis que MyISAM est un index non clusterisé. les index de texte intégral, mais MyISAM le fait. 5. InnoDB prend en charge les verrous au niveau des tables et des lignes, tandis que MyISAM prend en charge les verrous au niveau des tables ; 6. Les tables InnoDB doivent avoir des index uniques, mais Myisam n'en a pas besoin ; . Les fichiers de stockage sont différents.
L'environnement d'exploitation de ce tutoriel : système windows7, version mysql8, ordinateur Dell G3.
InnoDB : le moteur transactionnel par défaut de MySQL et le moteur de stockage le plus important et le plus utilisé. Il est conçu pour traiter un grand nombre de transactions à court terme. Dans la plupart des cas, les transactions à court terme sont soumises normalement et sont rarement annulées. Les performances d'InnoDB et ses fonctionnalités de récupération automatique en cas de crash le rendent populaire pour les besoins de stockage non transactionnel. Sauf raison très particulière d’utiliser un autre moteur de stockage, le moteur InnoDB doit être prioritaire.
MyISAM : dans MySQL 5.1 et les versions antérieures, MyISAM est le moteur par défaut. MyISAM fournit un grand nombre de fonctionnalités, notamment l'indexation de texte intégral, la compression, les fonctions spatiales (SIG), etc., mais MyISAM ne prend pas en charge les transactions et les verrous au niveau des lignes, et un défaut incontestable est qu'il ne peut pas être récupéré en toute sécurité après une accident.
1. InnoDB prend en charge les transactions, MyISAM ne le fait pas. Pour InnoDB, chaque langage SQL est encapsulé dans une transaction par défaut et automatiquement soumis. Cela affectera la vitesse. , il est donc préférable de placer plusieurs instructions SQL entre start et commit pour former une transaction ;
2 InnoDB prend en charge les clés étrangères, mais pas MyISAM. La conversion d'une table InnoDB contenant des clés étrangères en MYISAM échouera ;
3. InnoDB est un index clusterisé, utilisant B+Tree comme structure d'index, et le fichier de données est lié à l'index (clé primaire) (les données de la table). fichier lui-même C'est une structure d'index organisée par B+Tree), il doit avoir une clé primaire, et l'indexation via la clé primaire est très efficace. Cependant, l'index auxiliaire nécessite deux requêtes, d'abord pour interroger la clé primaire, puis pour interroger les données via la clé primaire. Par conséquent, la clé primaire ne doit pas être trop grande, car si la clé primaire est trop grande, les autres index le seront également.
MyISAM est un index non clusterisé et utilise également B+Tree comme structure d'index. L'index et les fichiers de données sont séparés, et l'index enregistre le pointeur du fichier de données. Les index de clé primaire et les index secondaires sont indépendants.
C'est-à-dire : les nœuds feuilles de l'index de clé primaire de l'arbre B+ d'InnoDB sont les fichiers de données, et les nœuds feuilles de l'index auxiliaire sont les valeurs de la clé primaire tandis que les nœuds feuilles de la clé primaire de l'arbre B+ de MyISAM ; l'index et l'index auxiliaire sont les pointeurs d'adresse des fichiers de données.
4. InnoDB n'enregistre pas le nombre spécifique de lignes dans la table et une analyse complète de la table est requise lors de l'exécution de select count(*) from table. MyISAM utilise une variable pour enregistrer le nombre de lignes dans le tableau entier. Lors de l'exécution de l'instruction ci-dessus, il vous suffit de lire la variable, ce qui est très rapide (notez qu'aucune condition WHERE ne peut être ajoutée
Alors pourquoi) ; InnoDB n'a pas cette variable ?
En raison des caractéristiques de transaction d'InnoDB, le nombre de lignes dans le même calendrier est différent pour différentes transactions, donc les statistiques de comptage calculeront le nombre de lignes pouvant être comptées pour la transaction en cours au lieu de stocker le nombre total de lignes. C’est pratique pour une requête rapide. InnoDB essaiera de parcourir le plus petit index possible à moins que l'optimiseur ne vous invite à utiliser un autre index. Si l'index secondaire n'existe pas, InnoDB tentera également de parcourir d'autres index clusterisés.
Si l'index n'est pas complètement dans le buffer maintenu par InnoDB (Buffer Pool), l'opération de comptage prendra plus de temps. Vous pouvez créer un tableau qui enregistre le nombre total de lignes et laisser votre programme mettre à jour les données correspondantes lors de INSERT/DELETE. Comme le problème mentionné ci-dessus, cette solution n’est pas très utile s’il y a plusieurs transactions à ce moment-là. Si la valeur approximative de la ligne est suffisante pour répondre à vos besoins, vous pouvez essayer SHOW TABLE STATUS
5. Innodb ne prend pas en charge l'indexation en texte intégral, mais MyISAM prend en charge l'indexation en texte intégral. MyISAM est de plus en plus rapide en termes d'efficacité des requêtes. indexation en texte intégral ; PS : InnoDB après 5.7 prend en charge l'index en texte intégral
6. Les tables MyISAM peuvent être compressées pour les opérations de requête
7. InnoDB prend en charge les verrous de niveau de table et de ligne (par défaut), tandis que MyISAM prend en charge les verrous de niveau de table. -verrous de niveau
? Le verrouillage de ligne d'InnoDB implémenté sur l'index, plutôt que sur l'enregistrement de ligne physique. Le sous-texte est que si l'accès n'atteint pas l'index et que le verrou de ligne ne peut pas être utilisé, il dégénérera en verrou de table. Par exemple :t_user(uid, uname, age, sex) innodb; uid PK 无其他索引 update t_user set age=10 where uid=1; 命中索引,行锁。 update t_user set age=10 where uid != 1; 未命中索引,表锁。 update t_user set age=10 where name='chackca'; 无索引,表锁。
8. La table InnoDB doit avoir un index unique (comme une clé primaire) (si l'utilisateur ne le spécifie pas, une colonne cachée Row_id sera trouvée/produite pour servir de clé primaire par défaut key), alors que Myisam n'en a pas besoin
9. Les fichiers de stockage Innodb sont frm, ibd, et Myisam est frm, MYD, MYI
Innodb : frm est un fichier de définition de table, ibd est un fichier de données.
Myisam : frm est un fichier de définition de table, myd est un fichier de données, myi C'est un fichier d'index
1. Voulez-vous prendre en charge les transactions Si oui, veuillez choisir innodb. Sinon, vous pouvez considérer MyISAM ;
2. Si la plupart des tables sont uniquement destinées aux requêtes de lecture, vous pouvez considérer MyISAM. Si vous savez lire et écrire, veuillez utiliser InnoDB.
3. Après un crash du système, il est plus difficile pour MyISAM de récupérer. Est-ce acceptable
4. Innodb est devenu le moteur par défaut de MySQL depuis la version 5.5 (anciennement MyISAM), ce qui montre que c'est le cas. les avantages sont évidents pour tous Oui, si vous ne savez pas quoi utiliser, alors utilisez InnoDB, au moins ce n'est pas mal.
Pourquoi InnoDB recommande-t-il d'utiliser un ID à incrémentation automatique comme clé primaire ?
Réponse : L'ID à incrémentation automatique peut garantir que l'index B+ est étendu à partir de la droite à chaque fois qu'il est inséré, ce qui peut éviter les arbres B+ et les fusions et fractionnements fréquents (par rapport à l'utilisation de l'UUID). Si vous utilisez des clés primaires de chaîne et des clés primaires aléatoires, les données seront insérées de manière aléatoire et l'efficacité sera médiocre.
Les 4 fonctionnalités majeures du moteur innodb
Insérer un tampon (insérer un tampon), double écriture (double écriture), index de hachage adaptatif (ahi), lecture anticipée (lecture anticipée)
【 Lié recommandations :tutoriel vidéo mysql】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!