본문 바로가기

Real MySQL 1권

(9)
[Real MySQL 1권] REPETABLE READ & SERIALIZABLE 1) REPETABLE READ란?- REPETABLE READ는 MySQL의 InnoDB 스토리지 엔진에서 기본으로 사용되는 격리 수준이다.  바이너리 로그를 가진 MySQL 서버에서는 최소 REPEATABLE READ 격리 수준 이상을 사용해야 한다.  - 이 격리 수준에서는 READ COMMITTED 격리 수준에서 발생하는   "NON-REPEATABLE READ" 부정합이 발생하지 않는다.  InnoDB 스토리지 엔진은 트랜잭션이 ROLLBACK될 가능성에 대비해   변경되기 전 레코드를 언두(Undo) 공간에 백업해두고 실제 레코드 값을 변경한다.  - 이러한 변경 방식을 MVCC라고 한다.  REPETABLE READ는 이 MVCC를 위해 언두 영역에 백업된 이전 데이터를 이용해  동일 트랜잭..
[Real MySQL 1권] MySQL의 격리 수준 - READ UNCOMMITTED, READ COMMITTED 1) MySQL의 격리 수준- 트랜잭션의 격리 수준(isolation level)이란 여러 트랜잭션이 동시에 처리될 때,   특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다.   격리 수준은 크게 "READ UNCOMMITTED", "READ COMMITTED", "REPETABLE READ", "SERIALIZABLE"  의 4가지로 나뉜다. - "DIRTY READ"라고도 하는 READ UNCOMMITTED는 일반적인 데이터베이스에서는 거의 사용하지 않고,   SERIALIZABLE 또한 동시성이 중요한 데이터베이스에서는 거의 사용되지 않는다.   - 4개의 격리 수준에서 순서대로 뒤로 갈수록 각 트랜잭션 간의 데이터 격리(고립) 정도가 높아..
[Real MySQL 1권] InnoDB 버퍼 1) InnoDB 버퍼 풀   - InnoDB 스토리지 엔진에서 가장 핵심적인 부분으로,   디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간이다.  쓰기 작업을 지연시켜 일괄 작업으로 처리할 수 있게 해주는 버퍼 역할도 같이 한다.  - 일반적인 애플리케이션에서는 INSERT, UPDATE ,DELETE처럼 데이터를 변경하는 쿼리는   데이터 파일의 이곳저곳에 위치한 레코드를 변경하기 때문에 랜덤한 디스크 작업을 발생시킨다.  하지만 버퍼 풀이 이러한 변경된 데이터를 모아서 처리하면 랜덤한 디스크 작업의 횟수를 줄일 수 있다.   2) 버퍼 풀의 크기 설정- 일반적으로 전체 물리 메모리의 80% 정도를 InnoDB의 버퍼 풀로 설정하라는 내용의 게시물도 있는데,  그렇게 단순하게 설정해..
[Real MySQL 1권] MVCC 1) MVCC(Multi Version Concurrency Control)이란? - MVCC는 일반적으로 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능이다.   MVCC의 가장 큰 목적은 잠금을 사용하지 않는 일관된 읽기를 제공하는데 있다.   InnoDB는 언두 로그(Undo log)를 이용해 이 기능을 구현한다.  - 여기서 멀티 버전이라 함은 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다는 의미다.  이해를 위해 격리 수준(Isolation level)이 READ_COMMITTED인 MySQL 서버에서  InnoDB 스토리지 엔진을 사용하는 테이블의 데이터 변경을 어떻게 처리하는지   그림으로 한 번 살펴보자.   - 우선 다음과 같은 테이블에 한 건의 레코드를 INSERT한..
[Real MySQL 1권] 클러스터링 인덱스 1) 클러스터링 인덱스란? - 클러스터링이란 여러 개를 하나로 묶는다는 의미로 주로 사용되는데,  지금 설명하고자 하는 인덱스의  클러스터링도 그 의미를 크게 벗어나지 않는다.  - MySQL 서버에서 클러스터링은 테이블의 레코드를 비슷한 것(프라이머리 키를 기준으로) 묶어서  저장하는 형태로 구현되는데, 이는 주로 비슷한 값들을 동시에 조회하는 경우가 많다는 점에서  착안한 것이다.  - MySQL에서 클러스터링 인덱스는 InnoDB 스토리지 엔진에서만 지원하며,  나머지 스토리지 엔진에서는 지원되지 않는다   2) 클러스터링 인덱스 특징  - 클러스터링 인덱스는 테이블의 프라이머리 키에 대해서만 적용되는 내용이다.  즉, 프라이머리 키 값이 비슷한 레코드끼리 묶어서 저장하는 것을 클러스터링 인덱스라고..
[Real MySQL 1권] 인덱스와 잠금 1) InnoDB 잠금과 인덱스  - InnoDB의 잠금과 인덱스는 상당히 중요한 연관 관계가 있다.   InnoDB의 잠금은 레코드를 잠그는 것이 아니라 인덱스를 잠그는 방식으로 처리된다. - 즉, 변경해야 할 레코드를 찾기 위해 검색한 인덱스의 레코드를 모두 락을 걸어야 한다.  정확한 이해를 위해 다음 UPDATE 문장을 한 번 살펴보자.  // 예제 데이터베이스의 employees 테이블에는 아래와 같이 first_name 칼럼만// 멤버로 담긴 ix_firstname이라는 인덱스가 준비돼 있다.// KEY ix_firstname (first_name)// employees 테이블에서 first_name='Georgi'인 사원은 전체 253명이 있으며,// first_name='Georgi'이고 ..
[Real Mysql 1권] 슬로우 쿼리 로그 1) MySQL 서버의 쿼리 튜닝  - MySQL 서버의 쿼리 튜닝은 크게 서비스가 적용되기 전에 전체적으로 튜닝하는 경우와  서비스 운영 중에 MySQL 서버의 전체적인 성능 저하를 검사하거나 정기적인 점검을 위한 튜닝으로 나눌 수 있다. - 전자의 경우에는 검토해야 할 대상 쿼리가 전부라서 모두 튜닝하면 되지만,  후자의 경우에는 어떤 쿼리가 문제의 쿼리인지 판단하기가 상당히 어렵다.  이런 경우에 서비스에서 사용되는 쿼리 중에서 어떤 쿼리가 문제인지를 판단하는 데  슬로우 쿼리 로그가 상당히 많은 도움이 된다.   2) 슬로우 쿼리 로그- 슬로우 쿼리 로그 파일에는 long_query_time 시스템 변수에 설정한 시간  (long_query_time 파라미터는 초단위로 설정하지만 소수점 값으로 설..
[Real MySQL 1권] 옵티마이저 1) 옵티마이저란? - MySQL 서버로 요청된 쿼리는 결과는 동일하지만 내부적으로 그 결과를 만들어내는 방법은 매우 다양하다  이런 다양한 방법 중에서 어떤 방법이 최적이고, 최소의 비용이 소모될지 결정해야 한다 -MySQL에서는 쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장돼 있는지 통계 정보를 참조하며,  그러한 기본 데이터를 비교해 최적의 실행 계획을 수립하는 작업이 필요하다.  MySQL 서버를 포함한 대부분의 DBMS에서는 옵티마이저가 이러한 기능을 담당한다.  2) 실행 계획이란?- MySQL에서는 EXPLAIN이라는 명령으로 쿼리의 실행 계획을 확인할 수 있는데,  EXPLAIN 명령의 결과에는 상당히 많은 정보가 출력된다.  실행 계획에 표시되는 내용을 제대로 이해..
[Real MySQL 1권] B-Tree - 구조 및 특성, 키 추가 및 삭제 1) B-Tree란?  - B-Tree는 데이터베이스의 인덱싱 알고리즘 가운데 가장 일반적으로 사용되고, 가장 먼저 도입된 알고리즘이다.   하지만 아직도 가장 범용적인 목적으로 사용되는 인덱스 알고리즘이다.  B-Tree에는 여러 가지 변형된 형태의 알고리즘이 있는데, 일반적으로 DBMS에서는 주로 B+-Tree 또는 B*-Tree  가 사용된다. - B-Tree의 가장 중요한 특징은 다음 2가지이다.   (1) 칼럼의 원래 값을 변형시키지 않음 - 이 특징 덕분에 전방(Prefix) 일치나 값의 일부만 검색하는 것이 가능다.   (2) 인덱스 구조체 내에서 항상 정렬된 상태로 유지  - 이 특징 덕분에 특정 값을 찾을 때, 탐색이 O(logn) 의 시간 복잡도로 가능하다. - 이러한 특징들로 인해, ..