본문 바로가기

데이터베이스5

'PK를 업무와 관련된 키로 설정하는 것이 좋을까' 에 대한 고민 제목: 'PK를 업무와 관련된 키로 설정하는 것이 좋을까' 에 대한 고민 InnoDB 스토리지 엔진에서는 클러스터링 인덱스를 사용하기 때문에 PK(Primary Key)의 선택이 개발하는 서비스의 성능에 전반적으로 중요한 영향을 미친다. 일반적으로 AUTO_INCREMENT 컬럼을 사용해 별도의 surrogate key를 PK로 사용하는 경우가 많지만, 업무적으로 의미가 있는 컬럼을 PK로 설정하는 것이 더 효율적인 경우가 많다고 알려져 있다. 널리 알려져 있는 것과는 별개로, 어떤 경우에 우리가 업무 도메인에서 해당 키를 PK로 설정했을 때 이득을 볼 수 있는지는 또 별개의 문제라고 생각한다. 그래서 약간의 케이스들을 찾거나 고민해본 뒤 정리해보기로 하였다. [업무 관련 PK를 사용하는 것이 좋은 경우.. 2025. 5. 17.
순차 PK vs. UUID: InnoDB 클러스터링 인덱스와 복제 전략 InnoDB에서는 클러스터링 인덱스(B+-트리) 구조를 사용한다. 즉, 테이블 전체가 하나의 거대한 인덱스로 관리되며, 리프 페이지에 PK 순으로 정렬된 실제 레코드가 저장된다. 덕분에 PK 기준 검색(SELECT)에선 압도적으로 빠르고, 특히 범위 스캔이 물리적 순서대로 일어나니 디스크·버퍼 캐시 효율까지 챙길 수 있다. 단점도 있다. 세컨더리 인덱스(=비클러스터드 인덱스)는 리프 노드에 PK 값만 들고 있기 때문에, '세컨더리 인덱스 → PK → 실제 레코드'라는 두 번의 lookup이 필연적이다. 또한 PK 값이 수정되거나 랜덤하게 삽입·삭제될 경우 페이지 split이 잦아지고, 그만큼 I/O 및 잠금 비용이 늘어난다. 그래서 MySQL 8.0 이상의 InnoDB에선 순차적으로 증가하는 AUTO_I.. 2025. 5. 17.
데이터베이스에 나오는 CASCADE란 단어는 무슨 뜻일까요? (+ FK와 참조 무결성) 영어가 모국어가 아닌 개발자는 항상 새로운 용어의 어원을 쫓아가는 것이 중요한 것 같다. CASCADE가 작은 폭포, 폭포처럼 흐르다라는 뜻인 걸 알게되면 대략적으로 왜 그런 이름을 사용했을지 조금이나마 추측이 가능하게 되고 다음번에 보게 되었을 때도 떠올리기 쉬워진다.. (한국어로 코딩을 한다면 어떤 기분일까?) 데이터베이스에서 사용되는 CASCADE라는 용어는 관계형 데이터베이스 관리 시스템(RDBMS)에서 참조 무결성을 유지하면서 데이터의 변경(수정 또는 삭제)이 연쇄적으로 반영되도록 하는 기능을 의미합니다. 아래에서 CASCADE의 원래 뜻과 데이터베이스에서의 구체적인 역할, 특히 외래 키(Foreign Key, FK)와 관련된 CASCADE UPDATE에 대해 설명하겠습니다.CASCADE의 원래.. 2025. 5. 11.
데이터베이스: 교착 상태(Deadlock) 서비스를 개발하고 운영하다 보면 데이터베이스 로그에서 "Deadlock found when trying to get lock; try restarting transaction" 와 같은 무시무시한 에러 메시지를 마주칠 때가 있습니다. 바로 교착 상태(Deadlock) 때문인데요, 여러 사용자가 동시에 데이터를 요청하고 수정하는 과정에서 흔히 발생할 수 있는 문제입니다. 이번 글에서는 MySQL/InnoDB 환경을 중심으로 데이터베이스 교착 상태가 무엇인지, 왜 발생하는지, 그리고 가장 중요하게 백엔드 엔지니어 입장에서 이를 어떻게 이해하고 대처해야 하는지 MySQL 공식 문서 내용을 바탕으로 알아보겠습니다. 그리고 이전에 운영체제 과목에서 '데드락'을 살펴본 적이 있고, 해당 글에서 데이터베이스는 감지 .. 2025. 4. 13.
데이터베이스 성능의 근본: 디스크 I/O 메커니즘과 최적화 전략 심층 분석 들어가며고성능 데이터베이스 시스템을 설계하고 운영하는 데 있어 디스크 I/O(Input/Output)의 특성을 이해하고 그 영향을 최소화하는 것은 가장 근본적이고 중요한 과제입니다. 컴퓨팅 리소스 계층 구조에서 CPU 캐시, 메인 메모리와 영구 저장 장치(디스크) 사이의 성능 격차는 여전히 수백만 배에 달하며, 이 간극은 대부분의 데이터 집약적 애플리케이션에서 주요 성능 병목으로 작용합니다. 이 글은 "Real MySQL 8.0"에서 강조된 디스크 I/O의 중요성을 바탕으로, 전통적인 HDD와 현대적인 SSD의 물리적 특성 차이, 랜덤 I/O와 순차 I/O 패턴의 본질적인 차이점 및 데이터베이스 워크로드와의 관계, 그리고 효과적인 쿼리 튜닝이 왜 궁극적으로 I/O 최적화로 귀결되는지를 심층적으로 분석합니.. 2025. 4. 3.