💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차SELECT FOR UPDATE읽기 작업(Read) 중 조회하는 레코드(Row)에 잠금(Lock)을 걸기 위해서 이 구문을 사용할 수 있다. 이 SELECT FOR UPDATE 구문을 사용하면 다른 트랜잭션에서 Lock을 건 Row에 대한 변경(Exclusive Lock)과 FOR UPDATE 조회를 방지할 수 있다. 하지만 변경과 조회에 대해 Lock을 걸기 때문에 함부로 사용하면 DeadLock이 발생할 수 있다. 반면 동시성 이슈가 발생하는 상황에서 유용하게 사용될 수 있다. 예를 들어 티켓팅을 하면 사용자가 동시에 접근한다. 이때 티켓 판매 상태에 대해 유용하게 샤..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차배경데이터베이스를 다루는데 가장 중요하고 핵심 개념인 Lock과 DeadLock에 대해서 알아본다. Lock은 데이터 정합성을 보장하고 동시성 이슈를 해결할 수 있는 방식 중 하나이며 서버 개발에서 가장 중요한 부분이다. 또한 Lock을 다루면서 DeadLock이 발생하는 케이스와 이를 예방하는 방법을 알아본다. MySQL Lock일반적으로 하나의 DB 서버에는 여러대의 애플리케이션이 붙어서 동작하게 된다. 이러한 상황에서는 Race Condition(경합상태)와 같은 동시성 이슈가 발생할 수 있는데, MySQL을 비롯한 관계형 데이터베이스는 이러한 상황에서 애플리케이션의..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차배경Offset과 이를 사용하지 않는 NoOffset 쿼리 튜닝에 대해서 알아본다. 동일한 결과를 반환하는 쿼리에 대해 성능을 개선할 수 있다.OffsetPaginatation을 구현할 때 사용하는 쿼리, 데이터를 어디서부터 가져올지 지정한다. Offset을 사용할 때는 쿼리가 지정된 Offset 값만큼의 레코드를 모두 읽어들인 후에 필요한 데이터를 반환한다. 이 때문에 Offset 값이 커질수록 MySQL이 불필요하게 많은 레코드를 스캔하여 성능 저하를 일으킬 수 있다. 예를 들어 아래 예시에서 데이터베이스는 처음 25개의 row를 조회한다. 이후 6번째부터 25번째 r..
💡 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는 성능 최적화에서 중요한 역할을 한다. 데이..
프로젝트 중 데이터 전송 건에 대해 누락이 있었고, 이를 확인하는 과정 중에 이해가 안가는 부분이 있어 파트 선배에게 질문을 했다. 선임 개발자분이 누락건과 그 이유를 분석하기 위해서 이력 테이블을 뒤져보고 pk를 조건 걸어서 조회해봤을때 매칭되는 로우가 없는 것을 보고 이력 테이블에 데이터가 누락되어있어서 전송이 안되었다고 하셨다. 이력 테이블에 해당 날짜를 조건으로 걸어서 조회했을때 데이터가 존재하지 않은것을 보고 누락되었다고 판단한 배경이 궁금해져서 질문을 했고, 선분이력 이라는 데이터를 관리하는 개념을 알게 되었다. 점이력(시점이력) 데이터의 변경이 발생한 시점에 대해서만 관리 선분이력 시점마다 달라지는 데이터를 관리하기 위한 개념 데이터의 변경이 적용된 시작 시점부터 그 상태의 종료시점까지 관리..
데드락(DeadlocK) 시스템 자원에 대한 요구가 뒤엉켜서, 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다리며 무한 대기에 빠지는 상황 데드락 발생 조건 상호 배제 한 번에 하나의 프로세스만 자원을 사용할 수 있음 사용중인 자원을 다른 프로세스가 사용하려면 해제될때까지 기다려야 함 점유 대기 다른 프로세스에 할당된 자원을 점유하기위해 대기하는 프로세스가 존재해야함 비선점 이미 할당된 자원을 강제로 뺏을 수 없음 순환 대기 대기 프로세스의 집합이 순환 형태로 자원을 기다리고 있어야함 해결 방법 예방(Prevention) 데드락이 발생하지 않도록 예방 회피(Avoidance) 데드락 발생 가능성을 인정하면서 적절하게 회피 탐지 및 회복(Detection & Recovery) 데드락 ..
DUAL 테이블 오라클에서 제공하는 기본 테이블 SYS 소유이지만 모든 사용자에게 권한을 주어서 내가 만든 테이블처럼 조회 가능 사용법 1. 임시로 원하는 임시 값을 리턴받고 싶을 때(간단한 테스트를 하는 경우) SELECT 'nooblette.net' as nooblette; select 쿼리를 통해 간단한 데이터베이스 접속 테스트를 원할 때 mysql과 MSSQL에서는 위와같이 select만 있는 쿼리를 지원해서 조회해볼 수 있지만, ORACLE에서는 이를 지원하지 않는다. SELECT 'nooblette.net' as nooblette FROM DUAL; 이때, 위처럼 FROM 절에 DUAL 테이블을 담아서 사용할 수 있다. 즉, FROM절에 특정 테이블을 담지않고 select 만으로 데이터를 조..