Mysql
 sql >> Base de données >  >> RDS >> Mysql

Performances MySQL :MyISAM contre InnoDB

Un facteur majeur des performances de la base de données est le moteur de stockage utilisé par la base de données, et plus précisément ses tables. Différents moteurs de stockage offrent de meilleures performances dans une situation plutôt qu'une autre. Pour une utilisation générale, il y a deux prétendants à considérer. Il s'agit de MyISAM, qui est le moteur de stockage MySQL par défaut, ou InnoDB, qui est un moteur alternatif intégré à MySQL destiné aux bases de données hautes performances. Avant de pouvoir comprendre la différence entre les deux moteurs de stockage, nous devons comprendre le terme "verrouillage".

Qu'est-ce que le verrouillage dans MySQL ?

Pour protéger l'intégrité des données stockées dans les bases de données, MySQL utilise le verrouillage. Le verrouillage, en termes simples, signifie la protection des données contre l'accès. Lorsqu'un verrou est appliqué, les données ne peuvent être modifiées que par la requête qui a initié le verrou. Le verrouillage est un élément nécessaire pour garantir l'exactitude des informations stockées. Chaque moteur de stockage utilise une méthode de verrouillage différente. En fonction de vos pratiques en matière de données et de requêtes, un moteur peut être plus performant qu'un autre. Dans cette série, nous examinerons les deux types de verrouillage les plus courants utilisés par nos deux moteurs de stockage.

Verrouillage de table : Technique consistant à verrouiller un tableau entier lorsqu'une ou plusieurs cellules du tableau doivent être mises à jour ou supprimées. Le verrouillage de table est la méthode par défaut utilisée par le moteur de stockage par défaut, MyISAM.

Exemple :Verrouillage de table MyISAM Colonne A Colonne B Colonne C
MISE À JOUR de la requête 1 Ligne 1 Écrire données données
Requête 2 SELECT (Attendre) Ligne 2 données données données
MISE À JOUR de la requête 3 (attendre) Ligne 3 données données données
Requête 4 SELECT (Attendre) Ligne 4 données données données
Requête 5 SELECT (Attendre) Ligne 5 données données données
L'exemple illustre comment une seule opération d'écriture verrouille la table entière, obligeant les autres requêtes à attendre la fin de la requête UPDATE.

Verrouillage au niveau de la ligne : Action de verrouiller une plage effective de lignes dans un tableau pendant qu'une ou plusieurs cellules de la plage sont modifiées ou supprimées. Le verrouillage au niveau des lignes est la méthode utilisée par le moteur de stockage InnoDB et est destiné aux bases de données hautes performances.

Exemple :verrouillage au niveau de la ligne InnoDB Colonne A Colonne A Colonne A
MISE À JOUR de la requête 1 Ligne 1 Écrire données données
Requête 2 SELECT Ligne 2 Lecture données données
MISE À JOUR de la requête 3 Ligne 3 données Écrire données
Requête 4 SELECT Ligne 4 Lecture Lecture Lecture
Requête 5 SELECT Ligne 5 Lecture données Lecture
L'exemple montre comment l'utilisation du verrouillage au niveau des lignes permet d'exécuter plusieurs requêtes sur des lignes individuelles en verrouillant uniquement les lignes mises à jour au lieu de la table entière.

MyISAM contre InnoDB

En comparant les deux moteurs de stockage, nous arrivons au cœur de l'argument entre l'utilisation d'InnoDB sur MyISAM. Une application ou un site Web qui a une table fréquemment utilisée fonctionne exceptionnellement bien avec le moteur de stockage InnoDB en résolvant les goulots d'étranglement de verrouillage de table. Cependant, la question de l'utilisation de l'un sur l'autre est subjective car aucun d'eux n'est parfait dans toutes les situations. Les deux moteurs de stockage présentent des points forts et des limites. Une connaissance intime de la structure de la base de données et des pratiques de requête est essentielle pour sélectionner le meilleur moteur de stockage pour vos tables.

MyISAM surpassera InnoDB sur les grandes tables qui nécessitent beaucoup plus d'activité de lecture que d'écriture. Les lisibilités de MyISAM surpassent InnoDB car le verrouillage de la table entière est plus rapide que de déterminer quelles lignes sont verrouillées dans la table. Plus il y a d'informations dans le tableau, plus il faut de temps à InnoDB pour déterminer celles qui ne sont pas accessibles. Si votre application s'appuie sur d'énormes tables qui ne modifient pas fréquemment les données, MyISAM surpassera InnoDB. Inversement, InnoDB surpasse MyISAM lorsque les données de la table changent fréquemment. Les changements de table écrivent plus de données que ne lisent de données par seconde. Dans ces situations, InnoDB peut gérer de grandes quantités de requêtes plus facilement que de verrouiller la table entière pour chacune d'entre elles.

Dois-je utiliser InnoDB avec les sites WordPress, Magento ou Joomla ?

La réponse courte ici est oui, dans la plupart des cas. Les équipes de support les plus utiles de Liquid Web pour l'hébergement ont rencontré plusieurs goulots d'étranglement de verrouillage de table lorsque les clients utilisent certaines applications Web standard d'aujourd'hui. La plupart des utilisateurs d'applications tierces populaires telles que WordPress, Magento et Joomla ont une connaissance limitée des composants de base de données sous-jacents ou du code impliqué pour prendre une décision éclairée sur les moteurs de stockage. La plupart des goulots d'étranglement liés au verrouillage des tables de ces systèmes de gestion de contenu (CMS) sont généralement résolus en remplaçant toutes les tables du site par InnoDB au lieu du MyISAM par défaut. Si vous hébergez plusieurs de ces types de CMS sur votre serveur, il serait avantageux de modifier le moteur de stockage par défaut dans MySQL pour utiliser InnoDB pour toutes les nouvelles tables afin que toute nouvelle installation de table commence avec InnoDB.

Configuration du moteur de stockage par défaut

Définissez votre moteur de stockage par défaut sur InnoDB en ajoutant default_storage_engine=InnoDB au [mysqld] section du fichier de configuration système située à : /etc/my.cnf. Le redémarrage du service MySQL est nécessaire pour que le serveur détecte les modifications apportées au fichier.

~ $ cat /etc/my.cnf
[mysqld]
log-error=/var/lib/mysql/mysql.err
innodb_file_per_table=1
default-storage-engine=innodb
innodb_buffer_pool_size=128M

Conversion de toutes les tables entre MyISAM et InnoDB

Malheureusement, MySQL n'a pas en soi une option pour convertir les tables, laissant chaque table être modifiée individuellement. L'équipe d'assistance de Liquid Web a élaboré un plan de maintenance facile à suivre pour ce processus. Le script, que vous pouvez exécuter sur le serveur nécessaire via un accès shell (SSH), convertira toutes les tables entre les moteurs de stockage.

RemarquePlanifiez en conséquence lorsque vous effectuez des opérations par lots de cette nature juste au cas où un temps d'arrêt se produirait. La meilleure pratique consiste à sauvegarder toutes vos bases de données MySQL avant de mettre en œuvre un changement de cette ampleur, ce qui fournit un point de récupération facile pour éviter toute perte de données.

Étape 1 :  Préparation

Prévoyez de commencer à une heure de la journée où les temps d'arrêt auraient des conséquences minimes. Ce processus lui-même ne nécessite aucun temps d'arrêt, cependant, un temps d'arrêt peut être nécessaire pour se remettre de circonstances imprévues.

Étape 2 :  Sauvegarder toutes les bases de données dans un fichier

La commande ci-dessous crée une sauvegarde de fichier unique de toutes les bases de données nommées all-databases-backup.sqld et peut être supprimée une fois la conversion réussie et qu'il n'y a aucun problème apparent.
mysqldump --all-databases > all-databases-backup.sql

Étape 3 :  Enregistrer les moteurs de table existants dans un fichier

Exécutez le script suivant pour enregistrer les moteurs de table existants dans un fichier nommé table-engine-backup.sql . Vous pouvez ensuite "importer" ou "exécuter" ce fichier ultérieurement pour le reconvertir dans ses moteurs d'origine si nécessaire.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=",Engine,";") FROM information_schema.tables WHERE table_schema NOT IN("mysql","information_schema","performance_schema");' | tee table-engine-backup.sql

Si vous devez restaurer les moteurs de table pour une raison quelconque, exécutez :
mysql < table-engine-backup.sql

Étape 4a :  Convertir les tables MyISAM en InnoDB

La commande ci-dessous continuera même si une table échoue et vous permet de savoir quelles tables n'ont pas pu être converties. La sortie est enregistrée dans le fichier nommé convert-to-innodb.log pour une révision ultérieurew.
mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=InnoDB;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "MyISAM";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-innodb.log

Étape 4b :Convertir toutes les tables InnoDB en MyISAM

Cette commande se poursuivra même si une table échoue et vous permet de savoir quelles tables n'ont pas pu être converties. La sortie est également enregistrée dans le fichier nommé convert-to-myisam.log pour examen ultérieur.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=MyISAM;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "InnoDB";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-myisam.log

Convertir une seule table entre MyISAM et InnoDB

Les commandes suivantes illustrent comment la conversion d'une seule table est accomplie.

RemarqueRemplacez database_name par le nom de base de données correct et table_name par le nom de table correct. Assurez-vous d'avoir une sauvegarde valide de la table en question avant de continuer.

Sauvegarder une seule table dans un fichier
mysqldump database_name table_name > backup-table_name.sql

Convertir une seule table en InnoDB

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=InnoDB;’

Convertir une seule table en MyISAM :

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=MyISAM;’

Consultez nos autres articles de cette série, Performances MySQL :Identification des requêtes longues, pour identifier les requêtes lentes dans votre base de données. Restez à l'écoute pour notre prochain article où nous aborderons la mise en cache et l'optimisation.

Navigation des séries<
>