반응형
어떤 경우에 인덱스를 사용하게 유도할지 말지를 판단하려면 어떻게 인덱스를 이용해서 실제 레코드를 읽는지 알 필요가 있다.MySQL이 인덱스를 이용하는 대표적인 3가지 방법을 알아보자. 인덱스 레인지 스캔가장 대표적인 인덱스 접근 방식으로 나머지 방법 중 가장 빠른 방법이다.인덱스 레인지 스캔은 검색해야 할 인덱스의 범위가 결정됐을 때 사용하는 방식이다. B-Tree 인덱스에서는 루트와 브랜치 노드를 이용해 스캔 시작 위치를 검색하고 그 지점부터 필요한 방향으로 인덱스를 읽어 나간다.인덱스 자체가 정렬되어 있기 때문에 이런 범위 검색 또한 빠르고 정렬된 상태로 레코드를 가져온다. 인덱스 레인지 스캔의 순서를 살펴보면 다음과 같다.인덱스에서 조건을 만족하는 값이 저장된 위치를 찾는다. (인덱스 탐색)1번에서..
우리는 종종 우리가 만든 API를 REST의 원칙의 일부만 지키더라도 REST API, RESTful API라고 부르는 경우들이 종종 있다.그렇다면 REST API, RESTEful API라고 하기 위해선 어떤 원칙들을 지켜야할까?이번 포스팅에서는 우리의 API가 정말 RESTful한지, RESTful하려면 어떻게 해야하는지 한번 알아볼 예정이다. REST란?REST란 "REpresentational State Transfer"의 약자로자원의 표현(이름)으로 구분해 자원의 상태(정보)를 전송하는 것을 의미한다. REST의 탄생 배경팀버너스리는 "어떻게 하면 인터넷에 정보를 쉽게 공유할 수 있을까?"로 시작하여1991년 모든 정보들을 하이퍼텍스트로 연결하는 시스템인 WWW(World Wide Web)을 만..
MySQL에는 여러 스토리지 엔진이 있지만 그중 InnoDB 스토리지 엔진이 기본값으로 설정되어 있다.그렇다면 왜 기본값으로 설정되어있는지 InnoDB의 특징에 대해 한번 알아보자. 클러스터링 인덱스와 논 클러스터리(세컨더리) 인덱스 구조대표적인 스토리지 엔진 중 MyISAM과 MEMORY 스토리지 엔진은 클러스터링 인덱스를 지원하지 않지만InnoDB에서 데이터는 기본적으로 PK를 기준으로 클러스터링되어 테이블에 저장되고논 클러스터링 인덱스는 레코드의 주소 대신 PK의 값을 논리적인 주소로 사용한다.그림을 보면 PK 주소값을 가지고 클러스터링 인덱스의 루트 노드부터 리프 노드까지 인덱스 키의 대소비교를 통해원하는 PK값이 존재하는 리프 노드까지 이동하여 찾는다. 반면 MyISAM의 경우에는 아래와 같이 ..
MySQL 엔진 구조MySQL 서버는 크게 커넥션 핸들러, MySQL 엔진, 스토리지 엔진으로 구분할 수 있다. 실행 흐름을 보면 다음과 같은 순서로 요청을 처리한다.1. 프로그래밍 API (클라이언트 단계 )프로그래밍 언어로 작성된 애플리케이션에서 MySQL 서버로 쿼리 요청한다.이 때 각 프로그래밍 언어별 MySQL 커넥터를 통해 통신한다. 2. MySQL 엔진의 커넥션 핸들러클라이언트의 접속 요청을 받아들인다.이 때 사용자 인증 및 권한 검사 수행과 쿼리 요청에 대한 커넥션 생성 및 관리를 담당한다. 3. MySQL 엔진의 쿼리 파서사용자 요청으로 들어온 쿼리 문장을 MySQL이 인식할 수 있는 토큰으로 분리해 트리 형태의 구조로 파싱한다.쿼리 문장의 기본 문법 오류는 이 과정에서 발견되고 사용에게..
Transaction (트랜잭션)트랜잭션은 데이터의 정합성을 보장해주는 RDBMS에 아주 필수적인 기술이다.InnoDB 스토리지 엔진은 트랜잭션을 보장하고 레코드 단위의 잠금을 제공하지만MyISAM, MEMORY 스토리지 엔진은 이 트랜잭션을 지원하지 않고 테이블 단위의 잠금을 제공한다.이 이유로 InnoDB 스토리지 엔진이 가장 많이 사용되는 것이라 추측된다. 트랜잭션 범위트랜잭션은 범위 또한 아주 중요하다.범위가 크다면 범위 내의 작업들의 정합성이 지켜진다는 점이 좋지만정합성이 중요하지 않은 작업이 끼어있다면 오히려 커넥션을 점유하고 있는 시간이 길어지는데이는 여유 커넥션의 개수가 줄어진 다는 것을 의미하고 TPS 수치 또한 떨어질 것이다. 특히 어떤 작업들이 트랜잭션 처리에 좋지 않을까정합성이 중요..
MySQL에서 사용되는 잠금은 크게 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다.MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미치지만스토리지 엔진 레벨의 잠금은 스토리지 엔진 간 상호 영향을 미치지 않는다.각각의 엔진별로 어떠한 잠금들이 있는지 알아보자.MySQL 엔진의 Lock글로벌 락MySQL에서 가장 큰 범위의 Lock으로 MySQL 서버 전체에 적용된다.다음 명령으로 획득할 수 있다.FLUSH TABLES WITH READ LOCK한 세션에서 글로벌 락을 획득하면 다른 세션에서는 SELECT를 제외한 대부분의 DDL, DML이 글로벌 락 해제까지 대기 상태로 기다린다. 다음과 같은 상황에서 사용할 수 있다.전체 DB의 물리적 백업이 필요할 때모든 DB와 타 스토리지 엔..