MySQL과 Spring Data JPA를 활용해 프로젝트를 진행할 때 아무 생각 없이 프라이머리 키를 AUTO_INCREMENT를 사용했었습니다.
"프라이머리 키를 꼭 AUTO_INCREMENT로 해야하나" 라는 생각이 들었고, 이에 관해 공부해보니 역시 프라이머리 키는 업무적으로 중요한 값으로 설정해야하는 것 이었습니다.
다른 사람들에게 도움이 될 수 있겠다 싶어 포스팅을 작성하게 되었습니다.
페이지의 중요성
페이지는 스토리지 엔진의 버퍼 풀에서 데이터를 버퍼링하는 기본 단위입니다. 또한, 디스크에 데이터를 저장하는 기본 단위이기도 합니다.
페이지의 크기는 정해져 있으며 그 용량을 초과할 시에 새로운 페이지를 만들어 저장합니다. 따라서, 하나의 페이지에 얼마나 많은 정보가 포함되어 있는 지가 중요합니다.
프라미머리 키 값은 크기가 작으면 작을 수록 좋다.
InnoDB의 경우 프라이머리 키는 모든 세컨더리 인덱스가 프라이머리 키 값을 포함합니다. 따라서, 세컨더리 인덱스 리프 페이지 그리고, 프라이머리 키의 페이지들은 모두 프라이머리 키를 포함합니다.
위에서 언급했던 것처럼 한 페이지에 최대한 많은 정보들이 있어야 한 번에 많은 정보를 조회할 수 있습니다. 따라서, 인덱스의 키 값은 작으면 작을 수록 좋습니다.
프라이머리 키는 Auto-Increment 보다는 업무적인 컬럼으로 설정하는 것이 좋다.
프라이머리 키는 클러스터링 키로 사용되고, 이 값에 의해 레코드의 위치가 저장됩니다. 즉, 프라이머리 키로 검색하는 것은 매우 빠릅니다.
따라서, 값의 크기가 좀 크더라도 업무적으로 해당 레코드를 대표할 수 있다면 그 컬럼을 프라이머리 키로 설정하는 것이 좋습니다.
Auto- Increment로 설정
로그 테이블과 같이 조회보다는 Insert 위주의 테이블은 AUTO_INCREMENT를 사용하는 것이 성능 향상에 도움이 됩니다.
프라이머리 키는 무조건 설정하자
프라이머리 키를 설정하지 않더라도 InnoDB에서는 내부적으로 프라이머리 키를 설정합니다. 내부적으로 설정된 키는 개발자가 사용할 수 없습니다.
어처피 프라이머리 키가 생성되기 때문에 개발자가 사용할 수 있게 프라이머리 키를 설정하는 것이 좋습니다.
출처)
Real My SQL 8.0 책
https://dev.mysql.com/doc/refman/8.4/en/innodb-best-practices.html
감사합니다!!
'스터디 > MySQL' 카테고리의 다른 글
READ COMMITED와 REPEATABLE READ 비교 (0) | 2025.01.06 |
---|---|
InnoDB스토리지 엔진 수준의 락 (0) | 2025.01.06 |
MVCC(Multi Version Concurrency Control) (0) | 2024.11.27 |
인덱스에 대해서 알아보자 (0) | 2023.09.07 |
MySQL이 인덱스를 이용하는 방법 (0) | 2023.09.07 |