목록분류 전체보기 (8)
Hello world
9.3 고급 최적화 MySQL 서버의 옵티마이저가 실행 계획을 수립할 때 통계 정보와 옵티마이저 옵션을 결합해서 최적의 실행 계획을 수립하게 된다. 옵티마이저 옵션은 크게 아래 두 가지로 나누어진다. 조인 관련 옵티마이저 옵션 옵티마이저 스위치 9.3.1 옵티마이저 스위치 옵션 옵티마이저 스위치 옵션을 수정하려면 아래처럼 커맨드를 사용해서 수정해야한다. mysql > SET GLOBAL optimizer_switch='index_merge=on,index_merge_union=on,....'; 그리고 사용 가능한 옵티마이저 스위치 옵션은 다음과 같다. 옵티마이저 스위치 이름 기본값 설명 batched_key_access off BKA 조인 알고리즘 사용 여부 block_nested_loop on Bloc..
들어가기 전 이 글은 RealMySQL 을 공부하며 작성한 글입니다. 9.1 개요 MySQL 서버가 사용자의 요청을 처리할 때, 빠른 수행을 위해 옵티마이저를 이용한 쿼리 최적화를 실행한다. 이 장에서은 옵티마이저에 대해서 공부할 예정이다. 9.1.1 쿼리 실행 절차 MySQL 서버에서 쿼리 실행 요청이 오면 다음 형태로 처리된다. SQL 파서 : 사용자가 작성한 SQL문장을 AST로 만든다. 전처리기 + 옵티마이저 : 접근할 테이블에 권한이 있는지 확인한 후, 쿼리를 최적화 한다. 스토리지 엔진 : 최적화 된 쿼리를 스토리지 엔진이 실행해서 데이터를 가져온다. 최적화 단계에서는 다음을 고려한다. 그리고 아래 과정은 옵티마이저가 처리한다. 불필요한 조건 제거 및 복잡한 연산의 단순화 테이블 조인이 있는 ..
들어가기 전 이 글은 Real MySQL을 공부하며 정리한 글입니다. 8.8 클러스터링 인덱스 MySQL에서 InnoDB 스토리지 엔진으로 생성된 테이블들은 모두 PK 값으로 클러스터링 된다. 이것을 클러스터링 인덱스라고 함. 클러스터링 인덱스는 'PK 값이 비슷한 녀석들은 같이 사용될 가능성이 높음' 이라는 것에 착안에 도입된 개념임. 8.8.1 클러스터링 인덱스 클러스터링 인덱스는 PK 값이 비슷한 녀석들을 하나의 데이터 페이지에 저장한다는 것이다. PK의 값이 어떤 데이터 페이지에 저장되어야 할지를 결정한다는 것이다. PK 값이 바뀌면 레코드가 저장된 데이터 페이지도 옮겨져야 함. PK 값 기반 검색은 빠름. 레코드의 저장 / PK 값 수정은 느림. (디스크 I/O가 더 발생해야 하기 때문) PK ..
8.1 디스크 읽기 방식 디스크 I/O는 가장 병목 되는 지점이다. 데이터베이스의 성능 튜닝은 디스크 I/O를 최소화하는 것이 목적이다. 8.1.2 랜덤 I/O와 순차 I/O 디스크의 성능은 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한번에 기록하느냐가 결정함. 디스크 헤더의 이동은 물리적 이동이기 때문에 상대적으로 오랜 시간이 걸림. 순차 I/O vs 랜덤 I/O 순차 IO : 데이터 페이지 10개 작성 위해 디스크 헤더 1번 이동. 랜덤 IO : 데이터 페이지 10개 작성 위해 디스크 헤더 10번 이동. 대부분 랜덤 I/O 위주로 발생함. InnoDB 스토리지 엔진은 이 부분을 해결하기 위해 InnoDB 버퍼풀 등을 이용함. 쿼리 튜닝의 목적은 랜덤 I/O를 최대한 줄여주는 것임. 8.2 인..
들어가기 전 이 글은 Real MySQL 8.0을 공부하며 작성한 글입니다. 5.1 트랜잭션 트랜잭션과 잠금은 서로 다른 목적을 가짐. 트랜잭션 : 원자성을 보장하기 위함. 잠금(Lock) : 동시성을 제어하기 위함. 5.1.1 MySQL에서의 트랜잭션 트랜잭션은 원자성을 제공해주는 도구임. 원자성은 트랜잭션 내의 모든 행동이 '전부 성공' 혹은 '전부 실패' 되는 것을 의미함. 트랜잭션이 지원되지 않는 경우, 일부 행동만 성공할 경우 롤백하거나 고려해야 할 상황이 매우 많아짐. 원자성을 보장해주는 트랜잭션을 적극 활용하는 것을 추천한다. 5.1.2 주의사항 트랜잭션은 좋은 도구이지만, 사용할 때 주의해야 할 점이 있다. 트랜잭션은 가급적 짧게 유지해야함. 트랜잭션 기간동안 웹 서버는 DB와의 커넥션을 ..
들어가기 전 이 글은 Real MySQL 8.0 4장을 공부하며 작성한 글입니다. 4. 아키텍쳐 MySQL 서버는 다음 아키텍쳐로 구성된다. MySQL 엔진(사람 머리) 스토리지 엔진(손발) MySQL 엔진이 스토리지 엔진에게 실행할 것을 요청하면, 스토리지 엔진이 실제 작업을 실행하는 방식으로 동작한다. 4.1 MySQL 엔진 아키텍쳐 MySQL의 엔진부터 살펴보자. 4.1.1 MySQL의 전체 구조 MySQL 서버는 다음과 같이 나누어 짐. MySQL 서버 MySQL 엔진 Connection Handler SQL 인터페이스 SQL Parser SQL Optimizer Cache / Buffer 스토리지 엔진 4.1.1.1 MySQL 엔진 MySQL 엔진은 다음 구성을 가진다. Connection Ha..
들어가기 전 이 글은 Real MYSQL 8.0 4장을 공부하며 작성한 글입니다. 4.2.11 리두 로그 및 로그 버퍼 리두 로그는 ACID중 영속성과 가장 밀접하게 연관되어 있다. 리두 로그는 MySQL 서버가 비정상적으로 종료되었을 때, 일관성있게 데이터가 저장될 수 있도록 돕는다. DB 서버는 변경 사항을 먼저 리두 로그에 저장함. 데이터 파일(데이터가 저장된 파일)은 읽기 성능을 고려한 자료 구조를 가짐. (쓰기 시, 랜덤 엑세스 발생) 쓰기 성능을 고려한 리두 로그에 먼저 작성함. 메모리의 리두 로그는 특정 시간 이후, 로컬의 리두 로그 파일에 동기화 됨. 데이터를 쓰고 있는 과정에 비정상 종료가 발생한다면, MySQL 서버는 리두 로그를 참고해서 데이터를 안전하게 영속화 할 수 있다. MySQ..
들어가기 전 이 글은 Real MySQL 8.0 4장을 공부하며 작성한 글입니다. 4.4 MySQL 로그 파일 MySQL은 몇 가지 로그 파일을 제공한다. MySQL 서버의 전문 지식이 없더라도 MySQL이 제공하는 로그만 잘 파악해도 문제를 추적 및 해결할 수 있다. 다음 로그를 제공한다. 에러 로그 제네럴 쿼리 로그 슬로워 쿼리 로그 4.4.1 에러 로그 파일 MySQL이 실행되는 도중에 발생하는 에러 / 경고 메세지가 저장된다. 다음 메세지가 주로 제공된다. MySQL이 시작하는 과정과 관련된 정보성 및 에러 메세지 MySQL에 특정 변수를 선언하고 이걸 사용하도록 했을 때, 이 값이 무시되는 경우에 에러 메세지가 남음. 비정상 종료 된 경우 나타나는 InnoDB 트랜잭션 복구 메세지 MySQL 비..