DB

    [DB] Mysql 옵티마이저 힌트

    옵티마이저MySQL 옵티마이저는 SQL 쿼리를 가장 효율적인 방법으로 실행하기 위해 쿼리를 분석하고 실행 계획을 선택하는 구성 요소입니다. 데이터베이스 내부에서 쿼리를 처리할 때 여러 가지 실행 경로가 가능할 수 있는데, 옵티마이저의 역할은 가능한 실행 경로 중에서 비용(리소스 사용, 시간 등)이 가장 낮은 경로를 찾아 선택하는 것입니다.MySQL 옵티마이저의 주요 기능쿼리 분석: 옵티마이저는 제공된 SQL 쿼리를 분석하여 구문적, 의미적 오류가 없는지 확인합니다. 이 단계에서 쿼리가 유효하고 실행 가능한지 검토합니다.쿼리 최적화: 옵티마이저는 다양한 최적화 기법을 사용하여 쿼리를 개선합니다. 예를 들어, 필요없는 조건을 제거하거나, 조인 순서를 변경하거나, 인덱스를 활용하는 방법 등을 적용할 수 있습니..

    [DB] 풀 테이블 스캔과 인덱스 스캔

    mysql 옵티마이저는 다음과 같은 조건이 일치할때 주로 풀 테이블 스캔 테이블의 레코드 건수가 너무 작아서 인덱스를 통해 읽는 것보다 풀 테이블 스캔을 하는 편이 더 빠른경우 WHERE 절이나 ON 절에 인덱스를 이용할 수 있는 적절한 조건이 없는 경우 인덱스 레인지 스캔을 사용할 수 있는 쿼리라고 하더라도 옵티마이저가 판단한 조건 일치 레코드 건수가 너무 많은 경우 강제 풀 테이블 스캔을 해야하는 경우 스트리밍 처리 mysql 스트리밍 처리 서버 쪽에서 처리할 데이터가 얼마인지에 관계없이 조건에 일치하는 레코드가 검색될 때마다 바로바로 클라이언트로 전송해주는 방식을 의미한다. 이 방식으로 쿼리를 처리할 경우 클라이언트는 쿼리를 요청하고 곧바로 원했던 첫 번째 레코드를 전달 받는다. 특징 쿼리 결과를 ..

    레디스 RedLock의 수행방식과 한계

    레디스 RedLock의 수행방식과 한계

    레디스 분산락 해당 글에서는 Redis의 분산락에 대한 개념을 설명한다. 글을 쓰게 된 이유 현재 진행하고 있는 프로젝트에서 선착순 이벤트를 진행하는데 현재 소프트웨어 아키텍쳐로는 선착순에 대해서 보장할 방법이 없었다. MySQL에 부담을 주기에는 사이드 이펙트가 크고 DB를 하나의 백엔드만 사용하고 있는 것이 아니고 다른 서버에서도 사용하고 잇기에 만약 DB에 문제가 생길 경우, 이펙트가 큰 상황이라서 DB 부담하는 것은 보기에서 제거를 했다. 앞으로의 기획 로드맵과 현재의 기획 부분에서 Redis가 적합한 선택이 될 것 같아 Redis를 선택하여 도입하였다. 도입과 동시에 선착순 이벤트에 대해서 정상적인 처리가 이루어졌지만 급하게 적용한 탓에 레디스의 분산락에 대한 이해가 부족하여 해당 개념에 대해서..

    [DB] PK AutoIncrement VS UUID

    테이블을 설계하는 과정에서 PK에 대한 고민을 많이 갖게 되었다. PK를 부여하는 방식에 여러 방식이 있지만, 대표적인 두가지는 UUID와 AI(Auto Increment)를 대표적으로 사용한다. 나는 현재 AI(Auto Increment)를 사용 중이다. AI를 선택하게 된 이유는 현재 서비스는 하나의 데이터베이스에서 서비스를 운영중이기에 PK생성을 DBMS에 이관하여도 괜찮다고 판단하였다. 하지만, 여러개의 DBMS에서 사용할 경우 한 row의 고유한 값을 보장할 수 없다. 해당 고민을 하면서 AI와 UUID에 대한 어떠한 트레이드 오프가 있는지 정리해보고자 한다. Auto Increment데이터베이스에서 사용되는 속성으로, 특정 필드의 값이 자동으로 증가하는 기능이며 해당 기능은 테이블에 새로운 레..

    [DB] MySQL 내부 엔진

    [DB] MySQL 내부 엔진

    강의를 듣던 중 MySQL 서버의 내부를 소개해주는 내용이 있어 정리하고자 한다. MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)이다. MySQL은 웹 애플리케이션을 위한 데이터베이스로 특히 많이 사용된다. MySQL 아키텍처 MySQL 엔진 내부 그러면 MySQL 엔진의 내부는 다음과 같이 쿼리 파서, 전처리기, 옵티마이저, 쿼리실행기를 거쳐서 스토리지 엔진으로 넘어간다. 해당 글에서는 MySQL 엔진 내부에서 어떠한 역할을 하는지 확인하려한다. 쿼리파서 SQL을 파싱하여 Syntax Tree를 만든다. 이 과정에서 문법 오류 검사가 이루어진다. 전처리기 쿼리파서에서 만든 Tree를 바탕으로 전처리 시작한다. 이블이나 컬럼 존재 여부, 접근권한 등 Semantic 오류 검사를 진행한..