MySQL 8.0

    인덱스

    디스크 읽기 방식 데이터베이스나 쿼리 튜닝에 어느 정도 지식을 갖춘 사용자가 절감하고 있듯이 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건일 때가 상당히 많다. 이에 자주 언급되는 "랜덤(Random) I/O", "순차(Sequence) I/O"를 알아보자. 하드 디스크 드라이브(HDD)와 솔리스 스테이트 드라이브(SSD) SSD는 기존 하드 디스크 드라이브에서 데이터 저장용 플래터(원판)를 제거하고 그 대신 플래시 메모리를 장착하고 있다. 그래서 데이터를 아주 빨리 읽고 쓸 수 있고, 전원이 공급되지 않아도 데이터가 삭제되지 않는다. SSD의 장점은 기존 하드 디스크 드라이브보다 랜덤 I/O가 훨씬 빠르다는 것이다. 데이터베이스 서버에서 순차 I/O 작업은 그다지 비중이 크지 않고 ..

    데이터 암호화

    MySQL 8.0 버전으로 업그레이드 되면서 데이터 파일뿐만 아니라 리두 로그나 언두 로그, 복제를 위한 바이너리 로그 등도 모두 암호화 기능을 지원하기 시작했다. MySQL 서버의 데이터 암호화 MySQL 서버의 암호화 기능은 데이터베이스 서버와 디스크 사이의 데이터 읽고 쓰는 지점에서 암호화 또는 복호화를 수행한다. 그래서 MySQL 서버에서 디스크 입축력 이외의 부분에서는 암호화 처리가 전혀 필요하지 않다. 즉, MySQL 서버(InnoDB 스토리지 엔진)의 I/O 레이어에서만 데이터의 암호화 및 복호화 과정이 실행되는 것이다. 테이블의 데이터가 암호화 기능이 활성화돼 있다고 하더라도 MySQL 내부와 사용자 입장에서는 아무런 차이가 없기 땜누에 이러한 암호화 방식을 TDE(Transparent D..

    데이터 압축

    MySQL 서버에서 디스크에 저장된 데이터 파일의 크기는 쿼리의 처리 성능과도 직결되지만 백업 및 복구 시간과도 밀접하게 연결된다. 디스크의 데이터 파일이 크면 클수록 쿼리 처리를 하기 위해서 더 많은 데이터 페이지를 InnoDB 버퍼 풀로 읽어야 할 수도 있고, 새로운 페이지가 버퍼 풀로 적재되기 때문에 그만큼 더티 페이지가 더 자주 디스크로 기록돼야 한다. 그리고 데이터 파일이 크면 클수록 백업 시간이 오래 걸리며, 복구하는 데도 그만큼의 시간이 걸린다. 이러한 문제점을 해결하기 위해 데이터 압축 기능을 많은 DBMS에서 제공한다. 페이지 압축 "Transparent Page Compression"이라고도 불림 위처럼 불리는 이유는 MySQL 서버가 디스크에 저장하는 시점에 데이터 페이지가 압축되어 ..

    트랜잭션과 잠금

    트랜잭션 : 작업의 완전성을 보장해 주는 것. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상(Partial update)이 발생하지 않게 만들어주는 기능 잠금(Lock)과 트랜잭션은 서로 비슷한 개념 같지만 사실 잠금은 동시성을 제어하기 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하기 위한 기능이다. MySQL에서의 트랜잭션 스토리지 엔진 중 MyISAM 이나 MEMORY 같은 스토리지 엔진은 트랜잭션을 지원하지 않는다. 태른잭션이 없어서 사용하기 단순할 것 같지만, 오히려 더 많은 문제를 만들어낸다. 일부 과정이 실패했을 때 생기는 Partial Update 같은 문제는 더 복잡한 후속조치 과정을 양산할 뿐이다. InnoD..

    InnoDB 스토리지 엔진 아키텍처(2)

    리두 로그 및 로그 버퍼 리두 로그(Redo Log)는 트랜잭션의 4가지 요소인 ACID 중에서 D(Durable)에 해당하는 영속성과 가장 밀접하게 연관돼 있다. 리두 로그는 하드웨어나 소프트웨어 등 여러 가지 문제점으로 서버가 비정상적으로 종료됐을 때 데이터 파일에 기록되지 못한 데이터를 잃지 않게 해주는 안전장치다. 기본적으로 MySQL은 innoDB의 변경 내용을 바로 디스크에 저장하지 않고 버퍼 풀에 저장하기 때문에, 변경된 데이터가 디스크에 적용되지 않았다면 재시작 동작 중에 Redo 작업을 먼저 수행하게 된다. MySQL 서버가 비정상 종료되는 경우 InnoDB 스토리지 엔진의 데이터 파일은 다음과 같은 두 가지 종류의 일관되지 않은 데이터를 가질 수 있다. 커밋됐지만 데이터 파일에 기록되지..

    InnoDB 스토리지 엔진 아키텍처

    InnoDB 스토리지 엔진 MySQL의 스토리지 엔진 중에서 유일하게 레코드 기반의 잠금을 제공하며, 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어난 스토리지 엔진이다. 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 프라이머리 키 값의 순서대로 디스크에 저장된다. 모든 세컨더리 인덱스는 레코드 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용한다. 프라이머리 키는 클러스터링 인덱스이기 때문에 프라이머리 키를 이용한 레인지 스캔은 상당히 빨리 처리될 수 있다. 결과적으로 쿼리의 실행 계획에서 다른 보조 인덱스보다 프라이머리 키가 인덱스로 선택될 확률이 높다. 외래 키 지원 InnoDB 스토리지 엔진 레벨에서만 지원한다. MyISAM이나 MEMORY 테이블에서는 사용할 수 없다. 외래..