본문 바로가기
스터디/MySQL

프라이머리 키를 설정할 때 주의할 점

by Big Sun 2023. 9. 5.
728x90

 

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 :: MySQL 8.4 Reference Manual :: 17.1.2 Best Practices for InnoDB Tables

17.1.2 Best Practices for InnoDB Tables This section describes best practices when using InnoDB tables. Specify a primary key for every table using the most frequently queried column or columns, or an auto-increment value if there is no obvious primary ke

dev.mysql.com

 

감사합니다!!

728x90