데이터 베이스의 설계 및 모델링의 핵심 구성 요소
이 장에서 중요한 주제
View: 데이터를 상용자 맞춤으로 표현하는 것
Index: 데이터 검색을 빠르게 하기 위함
Stored Procedures & Trigger: 데이터베이스의 작업을 자동화하고 효율화 하는데 사용됨
Constraints: 데이터 무결성 보장
Sequences: 고유 식별자 생성을 위한 연속적인 숫자를 생성하는데 사용됨
User-Defined Functions(UDFs): 내장 기능을 넘어 데이터 베이스의 기능을 확장 가능
열에 저장될 수 있는 값의 종류 정의
UUID
UUID에는 여러 종류가 있다.
MySQL에서 UUID를 저장하는 가장 좋은 방법은 VARBINARY(16) 타입을 사용하는 것. UUID를 순차적으로 저장하려면 UUID_TO_BIN(..., swap_flag) 함수를 사용하여 스왑 플래그를 활성화할 수 있다
인덱스가 많아지면 쓰기 작업(INSERT, UPDATE, DELETE)이 느려질 수 있다. 인덱스도 업데이트해야 하기 때문.
인덱스에 포함된 컬럼 수가 많아질수록 인덱스 크기도 커짐. 최적의 성능 유지를 위해 정기적인 유지보수가 필요할 수 있습니다. 데이터 분포와 쿼리 패턴이 바뀔 때 인덱싱 전략을 유연하게 조정할 준비를 하세요.
인덱스의 효과는 데이터베이스의 특정 쿼리와 데이터 분포에 크게 의존한다. 새로운 인덱스를 만든 후에는 성능을 테스트하고 모니터링하여 의도한 효과가 있는지 확인하는 것이 좋다.
각 검사 작업은 내부적으로 성능 저하를 유발할 수 있음
하나의 테이블에 너무 많은 제약 조건을 추가하면 안됨.
데이터베이스 관리는 단순히 일관성을 유지하는 것에 그치지 않는다. 데이터베이스가 커지고 복잡해질수록, 일관성과 성능, 확장성 간의 균형이 필요함.
이 세가지를 모두 충족시킬 수 없다. 두 가지를 선택하면 하나는 희생해야함.
일관성 외에도 데이터베이스 시스템을 종합적으로 관리하려면 다음과 같은 요소들을 고려해야 함:
MySQL은 많은 관계형 데이터베이스 시스템처럼 기본적으로 REPEATABLE READ 격리 수준을 사용
이 격리 수준은 높은 일관성을 제공하지만, 높은 동시성 환경에서는 성능 저하나 경합(lock contention) 을 유발할 수 있음.
ACID 속성 외에도 격리 수준은 트랜잭션 간의 충돌을 방지하여 무결성을 유지하는 추가적인 제어 도구입니다.
애플리케이션의 필요에 따라 적절한 격리 수준을 선택해 일관성과 성능 사이의 균형을 맞추는 것이 중요.
격리 수준의 일반적인 종류:
READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE트랜잭션 간 무결성을 유지하기 위해 데이터베이스는 잠금(Lock)을 사용한다.
MVCC(Multi-Version Concurrency Control)는 동시성을 관리하는 또 다른 기술
lock contention을 줄이고 성능을 향상시킴
MVCC는 데이터를 잠그는 대신, 여러 버전(스냅샷)을 유지하여 트랜잭션에 특정 시점의 데이터 상태를 보여주는 방식이다.
즉, 트랜잭션이 데이터를 읽을 때 변경 중이거나 최신 상태가 아닌, 자신이 시작한 시점의 데이터 버전을 참조함.
이 방식 덕분에 아래의 것들이 가능해짐
MVCC는 데이터 변형(mutation)을 대신하는 것이 아니라, 잠금 사용을 최소화하고 독립적인 스냅샷을 제공함으로써 동시성을 유지합니다.
MySQL과 PostgreSQL은 모두 MVCC를 지원하나 내부 구현 방식에 차이가 있다.
MVCC는 PostgreSQL아키텍쳐의 핵심
모든 트랜젝션에서 일관된 데이터 보기 제공, non-blocking 읽기를 가능하게 함.
PostgreSQL은 트랜젝션 ID를 사용해 MVCC를 구현함
그래서 불필요한 오래된 행 버전을 제거하는 Vacuum이라는 프로세스가 필요함.
이 과정으로 공간을 회수하고 성능을 향상.
MVCC지원 여부는 스토리지 엔진에 따라 다름.
지원하는 가장 대표적인 엔진 InnoDB
PostgreSQL과 유사하게, InnoDB도 행이 업데이트되거나 삭제될 때 새로운 버전의 행과 인덱스 항목을 생성
InnoDB는 PostgreSQL처럼 수동으로 vacuum을 실행할 필요 없이, 일상적인 작업 중 자동으로 오래된 행 버전을 정리함.