본문 바로가기

Database

InnoDB 스토리지 엔진 아키텍처 MySQL 스토리지 엔진 중에 가장 많이 사용되는 InnoDB는 거의 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 이번 글에서는 InnoDB 스토리지 엔진의 핵심 아키텍처를 자세히 살펴보고자 한다.프라이머리 키에 의한 클러스터링InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 이는 프라이머리 키 값의 순서대로 디스크에 저장된다는 의미이고, 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적 주소로 사용한다.클러스터링과 넌클러스터링의 차이클러스터링 인덱스는 데이터가 인덱스 키 순서대로 물리적으로 정렬되어 저장되는 구조다. 반면 넌클러스터링 인덱스는 데이터의 실제 저장 순서와 무관하게 별도의.. 더보기
MySQL 엔진 아키텍처 이해하기 항상 MySQL을 사용하면서 전반적인 구조가 궁금했다. 두루뭉실하게 알았던 내용을 Real MySQL을 토대로 정리하고자 한다. MySQL 서버는 사람의 머리 역할을 담당하는 MySQL 엔진과 손발 역할을 담당하는 스토리지 엔진으로 구분된다.MySQL 엔진클라이언트로부터 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다.스토리지 엔진MySQL 엔진은 요청된 SQL 문장을 분석하거나 최적화하는 등 DBMS의 두뇌에 해당하는 처리를 수행하고, 실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분은 스토리지 엔진이 담당한다.스레딩 구조MySQL 서버는 프로세스 기반이 아니라 스레드 기반으로 동작한다.. 더보기
MySQL, PostgreSQL의 날짜와 시간 타입이 만든 혼란 최근 저는 라이선스 관리 시스템을 개발하면서 MySQL에서 PostgreSQL로 마이그레이션을 진행했는데요. 다른 팀과 협업 및 Postgres 기능적 이점(Extension, REST API 구현,Master-slave 등)을 고려해 선택하게 되었는데요. 마이그레이션을 진행하면서 날짜와 시간에 대한 차이점으로 인해 어려움을 겪었어요. Postgres를 토입하면서 저는 해외 사용을 고려해 타임존을 UTC로 고정하고 시간도 UTC 기준으로 저장하고 파싱되길 원했는데요. 이를 위해 OffsetDateTIme 타입을 JPA 엔티티에서 사용했고, 개발 초기에 ddl-auth: create 설정을 통해 자동 테이블을 생성해 개발을 이어갔어요. 여러 테스트를 진행하면서 미묘한 차이가 나타나 각 DB의 날짜/시간을 .. 더보기
[ Database ] 정규화, 비정규화, 역정규화 👨‍💻 정규화(Normalization) 정규화의 기본 목표는 '테이블 간에 중복된 데이터를 허용하지 않는다'는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성을 유지할 수 있으며 DB의 저장 용량 역시 줄일 수 있다. 이러한 테이블을 분해하는 정규화 단계가 정의되어 있는데 테이블을 어떻게 분해되는지에 따라 정규화 단계가 달라진다. [ 제 1 정규화 ] ⁉️ 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것 ☑️ 위의 추신수와 박세리는 여러 개의 취미를 가지고 있기 때문에 제1 정규형을 만족하지 못하고 있다. 그렇기 때문에 이를 제 1정규화하여 분해하면 오른쪽 테이블과 같다. [ 제 2 정규화 ] ⁉️ 제1 정규화를 진행한 테이블에 대해 완전 함수적 종속을 만.. 더보기
[데이터베이스] RDBMS, NoSQL RDB key와 value들의 간단한 관계를 테이블화 시킨 매우 간단한 원칙의 전산 정보 데이터베이스이다. 관계 데이터베이스 모델의 주요 이점은 직관적인 데이터 표현 방법을 제공하고 관련 데이터 포인트에 쉽게 접근할 수 있다는 점이다. 관계 데이터베이스를 사용하면 데이터를 관리하고 저장할 때 다음과 같은 장점이 있다. 정형화된 데이터를 저장하기 때문에 데이터의 형태와 크기를 미리 정하고 테이블 단위로 구분하여 데이터를 저장할 수 있다. 트랜잭션을 통해 ACID를 보증하여 안정적인 데이터 관리가 가능하다. 조인을 포함해 복잡한 조건을 포함하는 데이터 검색이 가능하다. 데이터베이스 정규화 : 관계 데이터베이스는 데이터 중복성을 줄이고 데이터 무결성을 개선하는 정규화라는 설계 기법을 사용한다. RDBMS 행과.. 더보기
[데이터베이스] Index 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조 Index는 책의 색인과 같다. 데이터베이스에서도 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구를 생성하여 빠르게 조회할 수 있도록 돕고 있다. 인덱스를 활용하면 데이터를 조회하는 SELECT 외에도 UPDATE나 DELETE의 성능이 함께 향상된다. 인덱스 관리 DBMS는 Index를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다. 인덱스가 적용된 컬럼에 Insert, Update, Delete가 수행된다면 각각 다음과 같은 연산을 추가적으로 해주어야 한다. Insert : 새로운 데이터에 대한 인덱스를 추가함 Delete :.. 더보기
[데이터베이스] 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.. 더보기