Maison > base de données > tutoriel mysql > Connaissez-vous l'impact du BUG d'ID d'auto-incrémentation MySQL innodb ?

Connaissez-vous l'impact du BUG d'ID d'auto-incrémentation MySQL innodb ?

藏色散人
Libérer: 2022-10-18 16:46:37
avant
2087 Les gens l'ont consulté

Toutes ces années de MySQL ont été vaines. . . Savez-vous que le BUG d'ID d'incrémentation automatique MySQL innodb affecte 99% des systèmes existants. . .

Connaissez-vous l'impact du BUG d'ID d'auto-incrémentation MySQL innodb ?

Tout d'abord, reproduisons ce problème magique :

Créez une table de test avec un ID à incrémentation automatique, puis insérez 3 données et supprimez celle avec id = 3.

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
insert into test values ();
select LAST_INSERT_ID();
insert into test values ();
select LAST_INSERT_ID();
insert into test values ();
select LAST_INSERT_ID();
delete from test where id = 3;
Copier après la connexion

Ensuite, redémarrons le MySQL service.

Insérez à nouveau un enregistrement et jetez un œil au dernier identifiant inséré. . .

insert into test values ();
select LAST_INSERT_ID();
select * from test;
Copier après la connexion

Le résultat est qu'après avoir redémarré et réinséré l'enregistrement, l'ID est toujours 3 ! ! !

L'ID d'auto-incrémentation innodb d'origine sera automatiquement défini sur l'ID maximum + 1 dans l'enregistrement après le redémarrage du service.

Ce problème peut être reproduit 100% du temps dans un système qui a été physiquement supprimé.

Supposons que l'ID d'incrémentation automatique d'une certaine table sera également associé à d'autres enregistrements.

Dans les cas extrêmes, l'enregistrement avec le plus grand identifiant est supprimé avant de redémarrer le service. Une fois le service restauré, l'enregistrement est inséré puis associé. . .

Le problème du chaos des données est inimaginable !

Heureusement, ce problème a été résolu dans MySQL 8.0 !

Si vous êtes un utilisateur de MySQL 5.7 ou d'une version antérieure, ne vous inquiétez pas, les différentes solutions sont les suivantes :

* Remplacez toutes les suppressions physiques du système par des suppressions logicielles. Généralement, les frameworks ont cette fonction intégrée, et il est très pratique de la modifier et de la reconstruire.

* Activez le paramètre innodb_autoinc_persistent, il y a une perte de performances de 1 %, qui peut être ignorée.

innodb_autoinc_persistent=on
innodb_autoinc_persistent_interval=1
Copier après la connexion

Apprentissage recommandé : "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!

Étiquettes associées:
source:yurunsoft.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal