Maison  >  Article  >  base de données  >  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 ?

藏色散人
藏色散人avant
2022-10-18 16:46:032031parcourir

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;

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;

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer