Nous avons discuté il y a quelque temps de la façon de configurer InnoDB pour des performances élevées, cependant, nous n'avons pas encore expliqué comment nous pouvons améliorer les performances de MySQL tout en utilisant les paramètres avancés d'InnoDB. Ce billet de blog devrait fournir un peu plus d'informations sur ce sujet.
InnoDB expliqué
Avant de plonger plus profondément dans les paramètres d'InnoDB, nous devrions probablement comprendre les bases :InnoDB est un moteur de stockage pour MySQL, MariaDB et Percona Server. Le moteur était connu sous le nom de InnoDB Plugin, qui nécessite la configuration et l'installation du plug-in. Jusqu'à la sortie de MySQL 5.5.5, InnoDB n'est plus un plug-in et fait désormais partie du package MySQL en tant que l'un des moteurs de stockage pris en charge pour MySQL. Depuis la sortie de MySQL 5.6, InnoDB est devenu le moteur de stockage par défaut. Il s'agit d'un moteur de stockage à usage général qui allie haute fiabilité et hautes performances. Les principaux avantages d'InnoDB incluent la prise en charge du verrouillage au niveau des lignes, des clés étrangères et le respect du modèle ACID (Atomicity Consistency Isolation Durability) - ACID est un ensemble de propriétés destinées à garantir la validité des données malgré les erreurs, les pannes de courant et d'autres problèmes. InnoDB possède une longue liste de variables et certaines d'entre elles aident à améliorer les performances, en particulier sur le type de matériel et les ressources disponibles de votre serveur de base de données. Parmi ceux-ci, citons :
- innodb_data_file_path est le fichier dans lequel les données des tables InnoDB sont stockées.
- innodb_buffer_pool_size est une mémoire tampon qu'InnoDB utilise pour mettre en cache les données et les index de ses tables.
- innodb_log_file_size indique la taille des fichiers journaux InnoDB. Plus innodb_log_file_size est grand, plus le temps de récupération dont vous avez besoin en cas de plantage est long.
- innodb_log_buffer_size est utilisé par InnoDB pour écrire dans les fichiers journaux sur le disque.
- innodb_flush_log_at_trx_commit contrôle l'équilibre entre les performances et la conformité ACID. La valeur par défaut est 1, ce qui permet de maintenir la conformité d'InnoDB ACID ; passer innodb_flush_log_at_trx_commit à 2 permet d'obtenir une vitesse d'écriture très rapide, mais jusqu'à une seconde de transactions peut être perdue.
Il existe également des paramètres InnoDB avancés qui peuvent être définis pour améliorer encore plus les performances de MySQL. Nous allons les examiner maintenant.
Paramètres InnoDB avancés
Comme déjà indiqué ci-dessus, InnoDB dispose de paramètres avancés qui peuvent être utilisés pour améliorer encore ses performances (nous ne les énumérerons pas absolument tous, mais les paramètres répertoriés devraient vous donner un assez bon idée de la puissance d'InnoDB :
- InnoDB peut être désactivé - si vous souhaitez désactiver InnoDB, modifiez simplement le fichier my.cnf et ajoutez skip-innodb sous la section [mysqld]. Après cela, redémarrez votre serveur MySQL - InnoDB devrait maintenant être désactivé. Alternativement, vous pouvez utiliser l'option --innodb :la définir sur OFF désactive le moteur. Cependant, notez que ces options sont obsolètes depuis MySQL 5.7.5.
- InnoDB fournit également un mécanisme de verrouillage configurable qui peut améliorer les performances des instructions SQL qui ajoutent des lignes aux tables avec des colonnes AUTO_INCREMENT :les modes d'auto-incrémentation peuvent être configurés au démarrage à l'aide de l'option innodb_autoinc_lock_mode. L'option a trois paramètres pour spécifier le mode de verrouillage - le mode de verrouillage peut être 0 ("traditionnel"), 1 ("consécutif") ou 2 ("entrelacé"). Les valeurs offrent des performances en fonction du type d'insertion de base de données. Pour faire court, 0 offre une compatibilité avec les anciennes versions de MySQL et Innodb. La valeur 1 offre une approche plus sûre et déterministe pour la réplication basée sur les instructions (SBR). Alors que la valeur 2 a le mode de verrouillage le plus évolutif et le plus rapide, les lignes insérées par une instruction donnée peuvent ne pas être consécutives. Reportez-vous à la documentation MySQL pour plus d'informations.
- InnoDB vous donne la possibilité de diviser le pool de mémoire tampon en plusieurs segments (la fonctionnalité n'est disponible qu'à partir de MySQL 5.5) - le paramètre innodb_buffer_pool_instances vous permet d'améliorer l'évolutivité de MySQL sur les machines qui exécutent plusieurs cœurs. Par défaut, la valeur de ce paramètre est 1 si innodb_buffer_pool_size est inférieur à 1 Go et 8 sinon :le nombre spécifie le nombre de régions dans lesquelles le pool de tampons InnoDB est divisé. Ce paramètre peut être utilisé pour engager plus de cœurs, nous expliquerons comment plus tard.
- InnoDB propose quatre niveaux d'isolation de transaction (tx_isolation dans <5.7 mais transaction_isolation à partir de la version 5.7) :READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ et SERIALIZABLE :ces niveaux d'isolation sont le "I" dans l'acronyme ACID :
- Lorsque READ UNCOMMITTED est utilisé, une transaction peut voir des modifications non validées par une autre transaction. Ce niveau d'isolement autorise les lectures incorrectes.
- Lorsque READ COMMITTED est utilisé, vous pouvez être assuré que toutes les données lues ont été validées au moment où elles ont été lues.
- Lorsque REPEATABLE READ est utilisé, un niveau d'isolement supérieur est utilisé. En plus de tout ce qui est garanti par le niveau READ COMMITTED, il garantit également que les données déjà lues ne peuvent pas changer.
- Lorsque SERIALIZABLE est utilisé, un niveau d'isolement encore plus élevé est utilisé. En plus de tout ce qui est garanti par le niveau d'isolation REPEATABLE READ, il garantit également qu'aucune nouvelle donnée ne peut être vue par les lectures suivantes.
- InnoDB vous permet également de définir la capacité globale d'E/S disponible pour InnoDB en modifiant la variable innodb_io_capacity. La valeur de cette variable doit être définie approximativement sur le nombre d'IOPS que le système peut effectuer par seconde :lorsque vous définissez la valeur de ce paramètre, gardez à l'esprit que les valeurs autour de 100 sont plus appropriées pour les disques durs, tandis que les SSD peuvent bénéficier de valeurs plus élevées. . La variable innodb_io_capacity_max peut également être utile :cette variable permet à InnoDB de vider plus agressivement, ce qui signifie que le taux d'opérations d'E/S peut dépasser la limite définie par innodb_io_capacity - dans de telles situations, les opérations ne dépasseront pas la valeur définie par la variable innodb_io_capacity_max .
- InnoDB vous permet également de contrôler le nombre de threads d'arrière-plan disponibles pour les opérations d'E/S :le nombre de threads d'E/S alloués aux opérations de lecture peut être contrôlé par la variable innodb_read_io_threads tandis que le nombre d'E/S Les threads O alloués aux opérations d'écriture peuvent être contrôlés par la variable innodb_write_io_threads. La valeur par défaut pour ces deux paramètres est 4 et la valeur maximale autorisée est 64.
- InnoDB a la capacité de transformer certains avertissements InnoDB en erreurs :pour cela, il suffit de définir la variable innodb_strict_mode sur ON :cette variable affecte la gestion des erreurs de syntaxe pour les opérations CREATE TABLE, ALTER TABLE et CREATE INDEX :la désactivation de cette variable peut résoudre les erreurs "Taille de ligne trop grande". Pour désactiver le mode strict, définissez innodb_strict_mode sur OFF.
- InnoDB peut être quelque peu protégé contre les analyses complètes de table interférant avec les données mises en cache dans le pool de mémoire tampon en augmentant la variable innodb_old_blocks_time. La valeur minimale pour ce paramètre est 0, la valeur par défaut est 1000.
- Si vous exécutez des opérations de maintenance sur des tables InnoDB qui contiennent des index FULLTEXT, pensez à activer la variable innodb_optimize_fulltext_only - une fois cette variable activée, la requête OPTIMIZE TABLE devrait s'exécuter plus rapidement car elle ignorera la réorganisation des données dans la table. Notez que ce paramètre est destiné à n'être activé que temporairement, vous pouvez donc le désactiver une fois l'optimisation terminée.
- Pour démarrer InnoDB en mode lecture seule, activez le paramètre innodb_read_only. Lorsque ce paramètre est activé, vous pouvez interroger les tables InnoDB où le répertoire de données MySQL se trouve sur un support en lecture seule.
Faire en sorte qu'InnoDB engage plus de cœurs
Vous pouvez également faire en sorte qu'InnoDB engage plus de cœurs en tirant parti de ses capacités de multithreading :étonnamment, ce n'est pas très difficile à réaliser ; il vous suffit de modifier quelques paramètres. Voici comment procéder :
- Laissez l'option innodb_thread_concurrency à sa valeur par défaut 0. Ce faisant, vous laissez InnoDB décider du meilleur nombre de tickets de simultanéité (ils déterminent le nombre de threads pouvant entrer simultanément dans InnoDB) à ouvrir pour un MySQL donné configuration des instances. Pour MariaDB à partir de la version 10.5, il est marqué comme obsolète. Il serait donc logique que MySQL le définisse sur 0, car les ressources informatiques ont été sophistiquées par rapport aux premiers jours de MySQL.
- Une fois que l'option innodb_thread_concurrency est définie sur 0, définissez à la fois innodb_read_io_threads et innodb_write_io_threads sur leurs valeurs maximales de 64. Cela devrait engager plus de cœurs.
Résumé
Pour résumer, InnoDB est un moteur de stockage extrêmement puissant. Les performances de ce moteur de stockage sont directement affectées par les paramètres utilisés par ce moteur. Donc, si vous souhaitez améliorer les performances de votre instance MySQL, assurez-vous de garder à l'esprit au moins quelques-uns des conseils mentionnés dans cet article. Régler les paramètres concernant le moteur et les utiliser le cas échéant, le faire devrait vous donner un avantage.