Maison > Article > base de données > Connaissez-vous l'impact du BUG d'ID d'auto-incrémentation MySQL innodb ?
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. . .
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!