auto-increment 초기화
문제상황
스케쥴러로 미인증 회원들 삭제기능 만들었는데 임시회원이 인증 받으면 이메일 토큰 테이블이랑 임시회원 테이블에서 데이터 삭제하고 , 미인증 받은 상태로 일정 시간지나면 두 테이블에 있는 데이터들 전부 삭제한다. 근데 테이블에 있는 데이터 들을 전부 삭제한 상태에서 새로운 임시 회원이 들어오면 id값이 1 부터 시작되는게 아니라 이전 id값 다음값 부터 시작하게 된다. 이런 경우 데이터가 쌓이면 쌓일수록 계속 id값이 계속 커지기만 한다. 이때 db의 성능과 관련한 문제가 생기지 않을까? 계속해서 id값이 커지더라도 상관 없을까?
테이블이 전부 삭제된 후에 새로운 회원이 들어왔는데 이전 회원의 id값 다음값이 생성된다면 그 앞에 있는 id값들이 낭비 되는거 아닐까?
예를 들어서 100명이 임시 회원 가입을 했다가 인증을 받아서 회원가입해서 삭제되어 테이블이 전부 비워진 상태에서 새로운 데이터가 생성되는데 id값이 101부터 시작하면 1~100의 값은 사용되지 못하는 거니까 테이블 낭비 아닐까??
원인 분석
@Table(name = "USERTEMP_TABLE")
public class UserTemp {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="USERTEMP_ID")
private Long userTempId;
}
현재 내 userTemp 테이블의 pk는 자동으로 값이 증가하도록 설정해놨다.
이 설정은 데이터베이스가 자동 증가된 값을 관리하도록 하고, 삭제된 레코드의 ID를 재사용하지 않는다.
그래서 삭제된 후 새로운 레코드를 삽입하면 연속되지 않는 ID를 얻게 되는 것이다.
해결 방법
id값이 계속해서 커지거나 연속적이지 않은 id값이 만들어진다고 해서 성능에 큰 차이가 발생하지는 않는다고 한다.
오히려 연속적인 id 값을 만들기 위해 아래와 같은 설정을 했다가 트랜잭션과 데이터 무결성 부분에서 문제가 발생할 수 있다
굳이 연속적으로 id값을 생성해야하는 이유가 아니라면 다른 설정을 해줄 필요는 없을 것 같다.
TRUNCATE TABLE user_temp RESTART IDENTITY;
ALTER SEQUENCE user_temp_seq RESTART WITH 1;
참고자료
https://transferhwang.tistory.com/112
[Spring Boot] h2 Database 인덱스 auto_increment 초기화
스프링 부트 공부를 하면서 h2 DB를 이용해 실습하던 도중 다음과 같은 문제를 만났습니다. 임의의 DB의 테이블에 인덱스 값이 1,2,3,4 인 4개의 레코드가 있다고 가정했을때, 4번 인덱스의 레코드를
transferhwang.tistory.com
https://stackoverflow.com/questions/10065386/resetting-autoincrement-in-h2
Resetting autoincrement in h2
I'm testing a controller that returns a json response but the tests fail after the first time because the h2 database does not reset the auto increment id. Using fixtures or creating objects manual...
stackoverflow.com