MySQL의 모든 세월은 헛되었습니다. . . MySQL innodb 자동 증가 ID BUG가 기존 시스템의 99%에 영향을 미친다는 것을 알고 계십니까? . .
먼저 이 마법 같은 문제를 재현해 보겠습니다.
자동 증가 ID가 있는 테스트 테이블을 만든 다음 3개의 데이터를 삽입하고 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;
그럼 MySQL
서비스를 다시 시작하겠습니다.
기록을 다시 삽입하고 마지막으로 삽입된 ID를 살펴보세요. . .
insert into test values (); select LAST_INSERT_ID(); select * from test;
결과적으로 다시 시작하고 레코드를 다시 삽입해도 ID는 여전히 3입니다! ! !
원래 innodb 자동 증가 ID는 서비스가 다시 시작된 후 자동으로 기록의 최대 ID + 1로 설정됩니다.
이 문제는 물리적으로 삭제된 시스템에서 100% 재현될 수 있습니다.
특정 테이블의 자동 증가 ID가 다른 레코드와도 연결된다고 가정합니다.
심한 경우에는 서비스를 다시 시작하기 전에 가장 큰 ID를 가진 레코드가 삭제되고 서비스가 복원된 후 해당 레코드가 삽입된 후 연결됩니다. . .
데이터 혼란의 문제는 상상할 수 없습니다!
다행히 이 문제는 MySQL 8.0에서 해결되었습니다!
MySQL 5.7 이하 버전 사용자라면 걱정하지 마세요. 다양한 해결 방법은 다음과 같습니다.
* 시스템의 모든 물리적 삭제를 소프트 삭제로 변경하세요. 일반적으로 프레임워크에는 이 기능이 내장되어 있어 수정 및 재구성이 매우 편리합니다.
* innodb_autoinc_percious 설정을 활성화하면 1%의 성능 손실이 발생하며 이는 무시할 수 있습니다.
innodb_autoinc_persistent=on innodb_autoinc_persistent_interval=1
추천 학습: "MySQL 비디오 튜토리얼"
위 내용은 MySQL innodb 자체 증가 ID BUG의 영향을 알고 계십니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!