[Database] 복합 인덱스에서 컬럼 순서는 어떻게 결정해야 할까
·
Backend/Database
팀 프로젝트 festabook에서 학습한 내용을 정리한 글입니다. 시스(CS 스터디)에서 발표한 내용을 정리한 글입니다. 💭 들어가며본 글은 시스(CS 스터디)에서 발표한 내용을 정리한 자료로, 발표용 흐름에 맞추어 순차적으로 구성되어 있다. 개념에 대한 보다 정확한 이해가 필요하다면, 시스 유튜브에 업로드된 영상 자료를 함께 참고 바란다.글 중간에 ❓로 표시된 부분은 흐름상 자연스럽게 떠오른 의문을 의미하며, 하단 또는 확장하기 파트에서 다룬다. ✅ 문제 상황festabook에서는 성능 개선을 위해 복합 인덱스를 적용한 튜닝 사례가 있다. 이 과정에서 단순히 복합 인덱스가 필요하다는 판단을 넘어서, 컬럼의 순서가 실제 실행 계획과 성능에 어떤 영향을 미치는지에 대한 의문이 생겼다.이에 따라, 복합 ..
[Database] MySQL(InnoDB) 인덱스(Index) (2)
·
Backend/Database
우아한테크코스 레벨 4 팀 프로젝트 festabook에서 학습한 내용을 정리한 글입니다. 💭 들어가며이전 글에서 이론적인 관점에서 인덱스를 살펴보았고, 이번 글에서는 MySQL(InnoDB)을 기준으로 인덱스의 실제 종류와 실행 계획을 분석했다. 직접 쿼리를 실행해 동작을 검증하고, 그 결과를 토대로 인덱스의 실제 동작 원리를 정리해 보았다. ✅ MySQL(InnoDB) 구조MySQL(InnoDB)는 데이터를 B-Tree 구조로 저장한다. 이때 Secondary Index의 리프 노드에는 실제 데이터가 아닌 해당 레코드의 Primary Key 값이 저장되어 있으며, 실제 데이터는 Primary Key를 기준으로 한 B-Tree 구조의 데이터 파일에 따로 저장된다.이러한 구조를 클러스터링 인덱스(Clu..
[Database] 인덱스(Index) (1)
·
Backend/Database
우아한테크코스 레벨 4 팀 프로젝트 festabook에서 학습한 내용을 정리한 글입니다. 💭 들어가며처음 인덱스를 공부했을 때는 종류가 너무 많았는데, 막상 살펴보니 MySQL에서 실제로 지원하는 인덱스는 그리 많지 않아 혼란스러웠다. 찾아보니 인덱스의 분류 기준이 국제 표준(ISO)에서 명확히 정의되어 있지 않았고, 각 DBMS마다 지원하는 인덱스의 종류와 구현 방식은 모두 달랐다. 이로 인해 특정 DBMS에서 사용되는 인덱스 용어가 다른 DBMS에서도 혼용되거나, 구두나 문서로 설명되는 과정에서 특정 용어가 일반화된 것으로 보인다.따라서 이번 글에서는 인덱스의 개념과 이론적 분류 기준을 정리하고, 이후 글에서 MySQL이 실제로 지원하는 인덱스와 그 동작 방식을 구체적으로 살펴볼 예정이다.이 글은 ..
[Database] MySQL(InnoDB) 락(Lock) (2)
·
Backend/Database
우아한테크코스 레벨 4 팀 프로젝트 festabook에서 학습한 내용을 정리한 글입니다. 💭 들어가며이전 글에서 SQL 표준 관점에서 Lock을 살펴보았고, 이번에는 MySQL(InnoDB)를 기준으로 Lock의 실제 동작 방식을 구체적인 예시와 함께 살펴보았다. 직접 쿼리를 실행하며 확인한 결과를 바탕으로 정리해 보았다. ✅ MySQL 엔진의 Lock🔽 참고MySQL은 구조적으로 MySQL 엔진과 스토리지 엔진의 두 계층으로 구성되어 있다. 아래 그림에서 볼 수 있듯이, MySQL 엔진 락은 비교적 레거시에 가까운 개념이며, 현대 MySQL에서는 대부분의 동시성 제어가 InnoDB 스토리지 엔진의 락을 중심으로 이루어진다. ▶ 글로벌 락(Global Lock)데이터베이스 단위로 설정되는 락이다.M..
[Database] 락(Lock) (1)
·
Backend/Database
우아한테크코스 레벨 4 팀 프로젝트 festabook에서 학습한 내용을 정리한 글입니다. 💭 들어가며동시성 문제를 계기로 Lock에 대해 공부하면서, 공식 문서, 책, 블로그 등을 살펴보았다. 그러나 자료마다 설명이 제각각이었고, Real MySQL 8.0의 설명조차 MySQL 공식 문서와 다른 부분이 존재했다. 이는 DBMS마다 지원하는 Lock의 세부 종류와 동작 방식이 달라, 통일된 기준 문서를 찾기 어렵기 때문이다. 이번 글에서는 SQL 표준 문서를 기준으로 Lock의 전체적인 범위를 먼저 정리하고, 이후 글에서는 MySQL에 특화된 Lock 내용을 다룰 예정이다. ✅ Lock 지원 단위🔽 참고SQL 표준 문서에서 정의하는 Lock의 지원 단위는 Table과 Row에 한정된다. 그 외 Pag..
[Database] 동시성 문제(Read 계열), 트랜잭션 격리 수준
·
Backend/Database
우아한테크코스 레벨 4 팀 프로젝트 festabook에서 학습한 내용을 정리한 글입니다. 💭 들어가며서버에서 동시성 문제가 발생한 것을 확인했다. 팀원들과 논의하는 과정에서, 정확한 해결책을 찾으려면 트랜잭션 격리 수준에 대한 이해가 선행되어야 한다는 필요성을 느꼈다. 마침 레벨 4 강의에서 트랜잭션 격리 수준을 다루고 있어, 이를 학습하고 내용을 정리하고자 했다. 해당 글은 MySQL(InnoDB)을 기준으로 작성되었다. ✅ 트랜잭션트랜잭션(Transaction)은 데이터베이스에서 수행되는 작업 단위를 의미한다. 여러 SQL 문장을 하나의 논리적 단위로 묶어서, 전부 성공하거나 전부 실패하도록 보장한다. 🔽 트랜잭션 기본 구조BEGINUPDATEINSERTCOMMIT-- ROLLBACKBEGIN:..
[Database] MySQL 100만 건 데이터 삽입하기
·
Backend/Database
우아한테크코스 레벨 4 팀 프로젝트 festabook에서 학습한 내용을 정리한 글입니다. 💭 들어가며이번 작업은 미션 요구사항이기도 했고, 실제 사용자 유입이 시작되면서 더 이상 미룰 수 없었던 N+1 문제를 해결하는 과정에서 시작되었다. 동시에 DB 인덱스도 반드시 고려해야 한다고 판단했다. 하지만 단순한 추측만으로 어디에 인덱스를 걸어야 할지, N+1 문제가 얼마나 심각한지 판단할 수는 없었다.그래서 지금까지 쌓인 사용자 데이터를 토대로 앞으로 누적될 데이터를 예측해 넣어본 뒤, 실제로 성능이 얼마나 저하되는지 지표를 뽑아보기로 했다. 이 과정에서 대량 데이터를 직접 삽입해 본 것은 처음이었고, 이를 기록 차원에서 정리해 두고자 한다. ✅ 전체적인 설계본격적으로 진행하기 전에, 대량의 데이터를 한..
[Database] 데이터베이스 무중단 마이그레이션
·
Backend/Database
우아한테크코스 레벨 3 팀 프로젝트 festabook에서 학습한 내용을 정리한 글입니다. 💭 들어가며애플리케이션 무중단 배포는 많이 들어봤지만, 데이터베이스 무중단 마이그레이션은 상상조차 하지 못했다. 지금 내 수준에서 과연 시도할 수 있을까 하는 의문도 들었고, 실제로 과정도 복잡하고 높은 집중력이 필요했다. 그래도 공부하며 직접 경험해 보니 너무 재밌었다.다만 데이터베이스 무중단 마이그레이션에 대한 자료는 생각보다 많지 않았다. 검색해 보면 대부분 CDC 솔루션 홍보 글뿐이었고, 실제로는 많은 기업들이 데이터베이스를 워낙 중요한 자산으로 여기다 보니, 24시간 트래픽이 몰리는 서비스가 아닌 이상 잠시 중단을 감수하더라도 안전하게 마이그레이션하는 편을 택하는 것 같았다. 이번 글은 JETBRAINS ..
soeun2537
'Backend/Database' 카테고리의 글 목록