Database

    [Real MySQL, 6장 - 실행계획] type 컬럼 분석

    1. 알고자 하는 것 쿼리의 실행계획에서 type 컬럼은 MySQL 서버가 테이블의 레코드를 어떤 방식을 사용해 읽어왔는지를 의미한다. type 컬럼에 따라 쿼리의 성능과 튜닝 필요 여부를 판단할 수 있다. 실행계획의 type 컬럼 비교 2. 알게 된 것 type은 const > eq_ref > ref > ref_or_null > unique_subquery > index_subquery > index > ALL 순으로 성능이 빠르다. 각 실행계획의 성능 순서대로 알아보도록 한다. const WHERE 절에 PK 또는 유니크 컬럼을 동등 조건(=)으로 사용할 때 (결과가 반드시 1건일 때) 타 DBMS에서는 이를 유니크 인덱스 스캔(UNIQUE INDEX SCAN)이라고 한다. type 중 속도가 가장 ..

    [MySQL] GROUP_CONCAT으로 grouping 한 결과를 한줄로 출력하기

    1. 알고자 하는 것 회사에서 특정 조건으로 데이터를 2개의 그룹으로 그룹핑해서 추출하고, 이를 각각 일괄적으로 업데이트 해야하는 일이 있었다. 즉, 다음과 같은 형태이다. 이 때, 여러 데이터에 대해 콤마(,)로 구분지어 입력값을 넣으면 일괄적으로 업데이트를 처리할 수 있도록 팀 내에서 유틸성 기능을 Admin Page에서 제공하고 있었고, 이로 인해 특정 컬럼으로 그룹핑 된 n개의 데이터를 콤마로 구분지어 추출해야 했다. 이 때 유용하게 활용했던 GROUP_CONCAT 기능을 알아본다. GROUP_CONCAT 2. 알게된 것 사용자(member)는 여러 물건(product)을 구매할 수 있다. 사용자 별로 구매한 물건을 그룹핑해 콤마로 구분지어 출력해보자. member 테이블의 데이터는 다음과 같다...

    [Real MySQL, 4장 - 트랜잭션과 잠금] MySQL에서의 트랜잭션

    1. 알고자 하는 것 트랜잭션(Transaction)이란 트랜잭션이 필요한 이유 트랜잭션 적용 시 주의사항 2. 알게된 것 트랜잭션(Transaction)이란 데이터베이스에서 작업의 완전성을 보장하기 위한 개념 작업을 더 이상 쪼갤 수 없는 하나의 원자적인 단위로 묶음 이러한 논리적인 작업셋이 모두 성공하거나, 하나라도 실패 시 모두 적용하지 않고 되돌리는 것 (All or Nothing) 이는 단지 여러 개의 쿼리를 묶는 것만을 의미하지는 않음 단 하나의 쿼리라도 원자적인 작업으로 묶어, 실패 시 되돌린다. 다음과 같은 테이블이 있을 때, unique로 지정된 uid 컬럼이 중복되었을 때 트랜잭션이 어떻게 동작하는지 확인해본다. create table member ( id bigint auto_incr..

    [Real MySQL, 3장 - 아키텍처] MySQL에서의 복제(Replication)

    1. 알고자 하는 것 데이터베이스에서 대용량 데이터를 처리하기 위한 가용성(Availability)과 확장성(Scalability) MySQL에서의 복제(Replication) 복제(Replication) 시 고려해야 할 주의사항 Statement 포맷 방식과 Row 포맷 방식 2. 알게된 것 데이터베이스에서 대용량 데이터를 처리하기 위한 가용성(Availability)과 확장성(Scalability) 서비스 사용자의 수가 늘어나고, 서비스 아키텍처가 커짐에 따라 그에 따른 데이터는 기하급수적으로 많아진다. 이렇게 많아지는 데이터를 기존 하나의 데이터베이스만으로 관리하기 힘들다. 많은 데이터를 하나의 데이터베이스에서 다루게 되면 그에 따른 트래픽을 모두 하나의 데이터베이스가 감당해야 한다. 수많은 요청에..

    [Real MySQL, 3장 - 아키텍처] MySQL 엔진, 스토리지 엔진

    1. 알고자 하는 것 MySQL 엔진 스토리지 엔진 쿼리의 전체적인 실행 구조 2. 알게된 것 MySQL 엔진 클라이언트, 서버 등에서 요청한 SQL 문장의 파싱 및 최적화를 수행 DBMS의 두뇌로 비유 크게 커넥션 핸들러, SQL Parser, 전처리기, 옵티마이저로 구성 커넥션 핸들러 : 클라이언트와의 접속, 스토리지 엔진에게 데이터 R/W 쿼리 요청 SQL Parser : 클라이언트가 요청한 쿼리를 MySQL이 인식할 수 있는 단위 (토큰)로 분리해 트리형태 구조로 파싱. 쿼리의 문법적 오류를 해당 SQL Parser가 발견하고 오류 전달 전처리기 : 파서 트리 내 토큰과 개체(컬럼명, 내장함수, 객체 접근권한)를 비교해 쿼리 문장의 구조적 오류 확인. 존재하지 않는 토큰, 권한 오류를 해당 전처리..