>  기사  >  데이터 베이스  >  MySQL innodb 자체 증가 ID BUG의 영향을 알고 계십니까?

MySQL innodb 자체 증가 ID BUG의 영향을 알고 계십니까?

藏色散人
藏色散人앞으로
2022-10-18 16:46:032033검색

MySQL의 모든 세월은 헛되었습니다. . . MySQL innodb 자동 증가 ID BUG가 기존 시스템의 99%에 영향을 미친다는 것을 알고 계십니까? . .

MySQL innodb 자체 증가 ID BUG의 영향을 알고 계십니까?

먼저 이 마법 같은 문제를 재현해 보겠습니다.

자동 증가 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yurunsoft.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제