DB
[DB] 풀 테이블 스캔과 인덱스 스캔
mysql 옵티마이저는 다음과 같은 조건이 일치할때 주로 풀 테이블 스캔 테이블의 레코드 건수가 너무 작아서 인덱스를 통해 읽는 것보다 풀 테이블 스캔을 하는 편이 더 빠른경우 WHERE 절이나 ON 절에 인덱스를 이용할 수 있는 적절한 조건이 없는 경우 인덱스 레인지 스캔을 사용할 수 있는 쿼리라고 하더라도 옵티마이저가 판단한 조건 일치 레코드 건수가 너무 많은 경우 강제 풀 테이블 스캔을 해야하는 경우 스트리밍 처리 mysql 스트리밍 처리 서버 쪽에서 처리할 데이터가 얼마인지에 관계없이 조건에 일치하는 레코드가 검색될 때마다 바로바로 클라이언트로 전송해주는 방식을 의미한다. 이 방식으로 쿼리를 처리할 경우 클라이언트는 쿼리를 요청하고 곧바로 원했던 첫 번째 레코드를 전달 받는다. 특징 쿼리 결과를 ..
[DB] PK AutoIncrement VS UUID
테이블을 설계하는 과정에서 PK에 대한 고민을 많이 갖게 되었다. PK를 부여하는 방식에 여러 방식이 있지만, 대표적인 두가지는 UUID와 AI(Auto Increment)를 대표적으로 사용한다. 나는 현재 AI(Auto Increment)를 사용 중이다. AI를 선택하게 된 이유는 현재 서비스는 하나의 데이터베이스에서 서비스를 운영중이기에 PK생성을 DBMS에 이관하여도 괜찮다고 판단하였다. 하지만, 여러개의 DBMS에서 사용할 경우 한 row의 고유한 값을 보장할 수 없다. 해당 고민을 하면서 AI와 UUID에 대한 어떠한 트레이드 오프가 있는지 정리해보고자 한다. Auto Increment데이터베이스에서 사용되는 속성으로, 특정 필드의 값이 자동으로 증가하는 기능이며 해당 기능은 테이블에 새로운 레..
[DB] 동시성 이슈(Concurrency Issue)
동시성(Concurrency) 동시성은 운영체제에서 사용되는 용어로 동시에 실행되는 것처럼 보이는 것으로 논리적인 개념으로 싱글코어와 멀티코어에서 가능하다. 해당 글에서 사용되는 DB에서의 여러개의 스레드(요청)이 동시에 같은 주소의 값(데이터)을 참조하여 접근 및 수정하는 것을 의미한다. 예를들어, 트랜젝션 A가 알렉스라는 이름을 읽고 트랜젝션 B가 밥을 추가해 같은 트랜젝션에서 1번의 리드와 3번의 리드가 다른 것을 확인한다. 유령 레코드가 나타나는 현상으로 이를 팬텀리드(Phantom Read)라 한다. 일반적으로 문제 해결 방식에는 두 가지 방법이 존재한다. 1. 비관적 동시성 제어 데이터를 비관적으로 바라보며 다른 요청에 의해서 수정될 가능성을 염두하여 Lock을 거는 방식이다. 데이터베이스의 ..
서울시 심야버스 데이터 의사결정 사례
서울시는 심야 버스에 노선에 대한 최적화를 KT와 MOU를 통해 휴대전화 이력 데이터에서 유동인구 통계 정보를 바탕으로 노선을 정하였다. 서울시의 데이터 마이닝 기법은 이렇다. 우선, 서울시를 1km 반경의 1,250개 헥사셀 단위로 구분을 통해 한달 동안의 KT 휴대전화 이력 데이터로 오전 0시부터 5시 통화량을 분석을 통해 구역별 유동신우. 밀집도를 분석하고 이를 헥사셀 단위로 시각화하였다. 유동인구 밀집도 분석을 통해 기존 노선의 시간/요일별 패턴을 분석하고, 노선 부근의 유동인구 통계로 가중치를 계산하여, 노선을 최적화한다. 또한, 서울시는 유동인구 데이터를 기반으로 정류장 단위로 통행량을 추정하고 통행량을 선의 굵기로 표현하여 헥사셀로 구분된 맵에 시각화함으로써 최종적으로 요일별 배차간격을 조정..