💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차Index Dive잘못된 인덱스 설정이나 비효율적으로 작성된 쿼리로 인해 MySQL 옵티마이저(Optimizer)가 쿼리 수행 전략을 수립할 때 많은 시간이 소요되는 현상을 말한다. 일종의 잘못된 로직으로 인해 발생하는 버그이며, Index Dive가 발생하면 쿼리 속도가 현저히 느려진다.Optimizer와 실행 계획쿼리가 MySQL 서버로 전달되면 옵티마이저(Optimizer)가 동작하여 쿼리의 실행 계획을 수립한다. DBMS에 따라 PostgreSQL은 캐시성으로 실행 계획 수립 단계를 스킵하기도 한다. MySQL도 하나의 Connection 내에서는 실행 계획 수립을..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차배경실무에서 개발을 하다보면 배치 작업을 비롯해서 대량의 데이터에 대해 일괄로 INSERT 작업이나 UPDATE 작업을 수행하게 된다. 이 또한 데이터가 많아지면 DB에 부하가 발생하고 배치가 실패하기도 한다. 결국 DB Connection이 들어가는 모든 데이터베이스 관련 작업은 고민을 하고 주의깊게 사용할 필요가 있는데, 이번에는 INSERT 쿼리를 사용할 때 DB 부하를 줄일 수 있는 최적화 방법을 알아본다.서버 부하본문에 들어가기에 앞서 서버 개발자는 항상 DB와 서버 부하에 대해서 고려해야한다. 일반적으로 서버에서 발생하는 부하는 데이터베이스에 이전하기 보다는 서..

💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차Order By이번에는 실무에서 큰 데이터를 다루는데 Order By를 사용하는 전략에 대해서 알아본다. 대용량 데이터를 다루는 경우 Order By는 골칫덩어리 같은 존재가 된다. 그 이유는 Order By는 데이터를 정렬하면서 추가적인 리소스가 요구되기 때문이다.따라서 이 경우 인덱스 설정에 유의해야한다. 또한 쿼리에 Order By 절이 포함되거나 정렬해야하는 필드에 대해 IN, OR 연산을 사용하는 것은 지양한다. 정렬하는 필드에 대해 OR 연산을 사용하는 경우 연산이 2배로 들고, IN 연산을 사용하는 경우 추가된 필드만큼 연산이 n배 더 든다고 생각하면 된다.S..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차Covering IndexPK 아닌 컬럼에 대해 인덱스를 설정(Non-Clustered Index)하면 컬럼 값들은 디스크의 별도에 B-Tree 구조에 저장된다. 즉 인덱스를 구성하는 B-Tree의 노드에는 인덱싱된 컬럼 값의 복사본과 Clusterd Index 행에 대한 포인터가 포함된다.이때 실제 테이블에서 데이터를 조회하지 않고 인덱스에 있는 컬럼 값들만 사용하여 쿼리의 결과 데이터를 가져올 수 있는 인덱스를 커버링 인덱스(Covering Index)라고 한다. Covering Index로 데이터를 조회하면 실제 테이블에 접근하지 않으므로 I/O가 줄어들고 탐색 성능..

💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차 배경지난 글에서는 Index를 비롯한 관련 기본 개념들을 알아보았다. 이번에는 여러 컬럼으로 인덱스를 구성하는 Multi Column Index와 그에 대한 특징을 알아본다. Multi Column Index(복합 인덱스)여러 개의 컬럼 조합으로 인덱스를 설정하는 방식, 실무에서 가장 많이 설정하는 인덱스 유형 중 하나이다. 다음과 같이 설정한 idx_col1_col2 인덱스가 복합 인덱스인데, 이때 컬럼을 명시한 순서대로 인덱스가 정렬된다. 즉 one_field 값들에 대해서 먼저 정렬하여 B-tree 구조를 만드는데, one_field에 동일한 값이 있다면 two_fi..
목차배경이전부터 RDB와 관련된 문제와 문제 해결 방안에 대한 궁금증이 있었고, 인프런에서 흥미로워 보이는 강의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법를 발견하여 수강하였다. 하지만 RDB와 쿼리를 서비스 로직을 구현하는데 사용해보기만 했지 실제 동작 원리를 이해해본적은 없어 강의를 수강하는데 어려움이 있었고, 따로 시간을 내어 추가적인 기본 지식을 찾아보았다. 강의 내용에 대해 정리해보기에 앞서 데이터베이스 성능 최적화와 관련된 가장 기본적인 지식인 인덱스(Index)에 대해서 알아본다.데이터베이스 인덱스MySQL을 포함한 대부분의 RDBMS는 테이블 검색 속도를 향상하기 위해 Index를 제공하고, 이러한 Index는 성능 최적화에서 중요한 역할을 한다. 데이..

목차배경지난 9월 3일 MongoDB.local Seoul에 당첨되어 세미나를 다녀왔다. 적어도 국내에서 가장 널리쓰이는 NoSQL인 MongoDB에서 주최하는 세미나인 만큼 방향성과 활용 사례를 가장 가까이 느낄 수 있다는 생각에 신청했고, 운이 좋게 당첨되어 다녀올 수 있었다. 내용 뿐만아니라 모든 개발자가 열정적으로 세션에 참여하여, 질문을 주고받으며 공유하는 환경 속에서 동기부여와 열정 또한 얻어갈 수 있었다. 세션은 AWS, 구글을 비롯한 국내 기업의 활용 사례와 Mongo DB의 제품 소개로 이루어져 있었는데, 국내 기업 사례를 제외하고는 대부분 영어로 진행되었다. 물론 동시 통역을 제공하고 있어 이해하는데 큰 어려움은 없었다. 참여 상품으로는 AWS 티셔츠, 구글 클라우드 후드티, Mong..

💡 최상용님의 실습으로 배우는 선착순 이벤트 시스템 강의를 듣고 정리한 내용입니다. 목차 글 목록[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (1/3) - 동시성 이슈와 Redis로 해결하기[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (2/3) - Kafka로 시스템 안정성 향상하기[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (3/3) - 요구사항 변경과 쿠폰 발급 실패 예외처리[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (번외) - DLT(DeadLetterTopic)을 이용한 메시지 Consume 재처리 배경지난 [시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (3/3) - 요구사항 변경과 쿠폰 발급 실패 예외처리에서 쿠폰 발급 Consumer에서 ..

💡 최상용님의 실습으로 배우는 선착순 이벤트 시스템 강의를 듣고 정리한 내용입니다. 목차 글 목록[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (1/3) - 동시성 이슈와 Redis로 해결하기[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (2/3) - Kafka로 시스템 안정성 향상하기[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (3/3) - 요구사항 변경과 쿠폰 발급 실패 예외처리[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (번외) - DLT(DeadLetterTopic)을 이용한 메시지 Consume 재처리 배경지난 글에 이어서 쿠폰 발급 시스템을 고도화하고 안정성을 향상시켜본다. 이번 글에서는 발급 가능한 쿠폰 개수를 ID당 1개로 제한하는 요구사항이 추가되..

💡 최상용님의 실습으로 배우는 선착순 이벤트 시스템 강의를 듣고 정리한 내용입니다. 목차 글 목록[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (1/3) - 동시성 이슈와 Redis로 해결하기[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (2/3) - Kafka로 시스템 안정성 향상하기[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (3/3) - 요구사항 변경과 쿠폰 발급 실패 예외처리[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (번외) - DLT(DeadLetterTopic)을 이용한 메시지 Consume 재처리 배경지난 [시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (1/3) - 동시성 이슈와 Redis로 해결하기 글에서 가장 기본적인 선착순 이벤트 시스..

💡 최상용님의 실습으로 배우는 선착순 이벤트 시스템 강의를 듣고 정리한 내용입니다. 목차 글 목록[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (1/3) - 동시성 이슈와 Redis로 해결하기[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (2/3) - Kafka로 시스템 안정성 향상하기[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (3/3) - 요구사항 변경과 쿠폰 발급 실패 예외처리[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (번외) - DLT(DeadLetterTopic)을 이용한 메시지 Consume 재처리 배경실시간 이벤트를 진행하거나 트래픽이 순간적으로 몰릴 때(혹은 그러한 상황이 예상될 때) 발생할 수 있는 이슈와 해결방안에 대해 알아보기위해 인프런의 실..

💡 최상용님의 재고시스템으로 알아보는 동시성이슈 해결방법 강의를 듣고 정리한 내용입니다. 목차 글 목록[시스템 디자인] 재고시스템으로 알아보는 동시성이슈 해결방법 (1/3) - 동시성 이슈와 Application Level로 해결하기[시스템 디자인] 재고시스템으로 알아보는 동시성이슈 해결방법 (2/3) - 데이터베이스 락(Lock)으로 해결하기[시스템 디자인] 재고시스템으로 알아보는 동시성이슈 해결방법 (3/3) - 레디스 분산 락(Lock)으로 해결하기배경지난 [시스템 디자인] 재고시스템으로 알아보는 동시성이슈 해결방법 (2/3) - 데이터베이스 락(Lock)으로 해결하기에 이어 이번에는 레디스(Redis)를 활용하여 동시성 문제를 해결해본다. 동시성 문제를 해결하기 위해서 레디스에서는 대표적으로 L..