web-dev-qa-db-fra.com

Les insertions dans MySQL 8 sont plus lentes que les insertions dans MySQL 5.7

J'ai commencé à utiliser MySQL 8 (8.0.12), et je me rends compte que les "insertions" sont plus lentes dans cette version que MySQL 5.6 ou MySQL 5.7. Peu importe si la table est MyISAM ou InnoDB, avec un seul "insert" avec un seul enregistrement, le serveur prend environ 0,2 ~ 0,3 secondes avec MySQL 8. La même "insertion" dans MySQL 5.7 ne prend que 0,003 secondes ou moins .

J'ai déjà jeté Windows Defender ou un autre programme antivirus, la vitesse d'écriture du disque dur n'est pas le problème car j'ai une machine virtuelle sur le même serveur, le VM a MySQL 5.7 et le résultat est assez bien aussi: 0,003 secondes ou moins.

J'ai testé le même "insert" dans différents ordinateurs avec différents S.O. et le résultat est toujours le même: MySQL 5.7 (ou 5.6) prend 0,003 secondes ou moins, tandis que MySQL 8 prend 0,2 ~ 0,3 secondes dans chaque insertion avec un seul enregistrement. Les "créations" sont également plus lentes.

Ce qui me semble étrange, c'est que les simples "sélections" ou "sélections avec jointures" sont plus rapides dans MySQL 8 que les versions précédentes. Je pense que le problème est avec les requêtes qui écrivent sur le disque, mais pas une limitation avec le disque, peut-être une limitation affectée dans my.ini ou dans un autre paramètre MySQL.

Ici, je vous laisse les scripts avec les performances lentes de MySQL 8:

CREATE TABLE `ciiu_test2` (
`id` INT(11) NULL DEFAULT NULL,
`codbut` VARCHAR(11) NULL DEFAULT NULL,
`ciiu` VARCHAR(8) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
;

Temps d'exécution dans MySQL 5.7: 0.016 secTemps d'exécution dans MySQL 8.0.12: 0.140 sec

INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (1, '18237', '2750');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (2, '18238', '9491');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (3, '18245', '9411');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (4, '18248', '2221');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (5, '18264', '3520');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (6, '18265', '4645');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (7, '18268', '6202');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (8, '18276', '6512');
INSERT INTO `ciiu_test2` (`id`, `codbut`, `ciiu`) VALUES (9, '18290', '4210');

Temps d'exécution dans MySQL 5.7: 0,002 sTemps d'exécution dans MySQL 8.0.12: 0,681 s

S'il vous plaît, ne me recommandez pas d'optimiser les "insertions" avec plusieurs enregistrements. Plus précisément, j'ai besoin d'obtenir les mêmes temps dans MySQL 8 avec chaque "insert" que j'ai eu une fois dans MySQL 5.7.

Je vous remercie à l'avance de l'aide que vous pouvez me donner avec ce problème.

Une différence entre 5.7 et 8.0 est que la journalisation binaire (à utiliser pour la réplication et PITR) est activée par défaut dans MySQL 8.0. Pour exécuter sans connexion binaire dans 8.0, démarrez le serveur MySQL avec --disable-log-bin.

Plus de détails Le journal binaire

Le journal binaire contient des "événements" qui décrivent les modifications de la base de données telles que les opérations de création de table ou les modifications des données de table. Il contient également des événements pour les instructions qui auraient potentiellement pu apporter des modifications (par exemple, un DELETE qui ne correspondait à aucune ligne), à ​​moins que la journalisation basée sur les lignes ne soit utilisée. Le journal binaire contient également des informations sur la durée pendant laquelle chaque instruction a pris ces données mises à jour. Le journal binaire a deux objectifs importants:

  • Pour la réplication, le journal binaire sur un serveur de réplication maître fournit un enregistrement des modifications de données à envoyer aux serveurs esclaves. Le serveur maître envoie les événements contenus dans son journal binaire à ses esclaves, qui exécutent ces événements pour apporter les mêmes modifications de données que celles effectuées sur le maître. Voir Section 17.2, "Implémentation de la réplication".
  • Certaines opérations de récupération de données nécessitent l'utilisation du journal binaire. Une fois la sauvegarde restaurée, les événements du journal binaire enregistrés après la sauvegarde sont réexécutés. Ces événements mettent à jour les bases de données à partir du point de la sauvegarde. Voir Section 7.5, "Récupération ponctuelle (incrémentielle) à l'aide du journal binaire".
9
Ivanov

Depuis MySQL 8, l'algorithme d'extraction des ensembles d'écriture de transaction est introduit, qui est XXHASH64. La nouvelle valeur par défaut permettra aux utilisateurs d'activer facilement la parallélisation du jeu d'écriture de journaux binaires sur le maître pour accélérer la réplication de groupe. [1] Si vous n'utilisez pas la réplication de groupe MySQL, vous pouvez modifier les paramètres de XXHASH64 à OFF. Et vous pouvez activer les journaux binaires si vous exécutez n'importe quel esclave en parallèle.

[mysqld]
#skip-log-bin 
transaction_write_set_extraction=OFF


  [1]: https://mysqlserverteam.com/new-defaults-in-mysql-8-0/
0
JYOTI RAJAI