본문 바로가기

MySQL

InnoDB 스토리지 엔진 아키텍처 MySQL 스토리지 엔진 중에 가장 많이 사용되는 InnoDB는 거의 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 이번 글에서는 InnoDB 스토리지 엔진의 핵심 아키텍처를 자세히 살펴보고자 한다.프라이머리 키에 의한 클러스터링InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 이는 프라이머리 키 값의 순서대로 디스크에 저장된다는 의미이고, 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적 주소로 사용한다.클러스터링과 넌클러스터링의 차이클러스터링 인덱스는 데이터가 인덱스 키 순서대로 물리적으로 정렬되어 저장되는 구조다. 반면 넌클러스터링 인덱스는 데이터의 실제 저장 순서와 무관하게 별도의.. 더보기
MySQL, PostgreSQL의 날짜와 시간 타입이 만든 혼란 최근 저는 라이선스 관리 시스템을 개발하면서 MySQL에서 PostgreSQL로 마이그레이션을 진행했는데요. 다른 팀과 협업 및 Postgres 기능적 이점(Extension, REST API 구현,Master-slave 등)을 고려해 선택하게 되었는데요. 마이그레이션을 진행하면서 날짜와 시간에 대한 차이점으로 인해 어려움을 겪었어요. Postgres를 토입하면서 저는 해외 사용을 고려해 타임존을 UTC로 고정하고 시간도 UTC 기준으로 저장하고 파싱되길 원했는데요. 이를 위해 OffsetDateTIme 타입을 JPA 엔티티에서 사용했고, 개발 초기에 ddl-auth: create 설정을 통해 자동 테이블을 생성해 개발을 이어갔어요. 여러 테스트를 진행하면서 미묘한 차이가 나타나 각 DB의 날짜/시간을 .. 더보기
[데이터베이스] Join 데이터베이스에서 Join은 서로 다른 테이블들을 연결하여 하나의 테이블로 결과를 보여주는 중요한 작업이다. 우선 MySQL로 데이터베이스 테이블과 샘플 데이터를 설정해보자. -- employees CREATE TABLE employees ( emp_id INT PRIMARY KEY, name VARCHAR(50), dept_id INT ); -- departments CREATE TABLE departments ( dept_id INT PRIMARY KEY, dept_name VARCHAR(50) ); -- insert sample data INSERT INTO employees (emp_id, name, dept_id) VALUES (1, 'Aliece', 101), (2, 'Bob', 102), (3.. 더보기