컴퓨터 과학/[Study] Real MySQL 8.0 13

Chapter 10.01 실행 계획

대이터베이스의 주 목적: 많은 데이터를 안전하게 보관하고 빠르게 조회한다. 이러한 목적을 위해 옵티마이저가 사용자 쿼리가 최적으로 처리되도록 실행 계획을 수립할 수 있어야한다. EXPLAIN 명령으로 옵티마이저가 수립한 실행 계획을 확인할 수 있다. 10.1 통계 정보 MySQL 5.7 버전까지는 테이블과 인덱스에 대한 개괄적인 정보를 가지고 실행 계획을 수립했다. 그런데 이는 테이블 칼럼의 값이 어떻게 분포되는지 정보가 없으모로 실행 계획의 정확도가 떨어지는 경우가 많았다. 그래서 8.0 버전부터는 인덱스되지 않은 칼럼들에 대해서도 데이터 분포도를 수진해서 저장하는 히스토그램(Histogram) 정보가 도입됐다. 10.1.1 테이블 및 인덱스 통계 정보 비용 기반 최적화에서 가장 중요한 것은 통계 정보..

Chapter 09.04 쿼리 힌트

MySQL 서버는 인간이 원하는 서비스를 100%이해하지는 못한다. 따라서 서비스 개발자 또는 DBA보다 MySQL서버가 부족한 실행 계획을 수립할 때가 있다. RDBMS에서는 이러한 목적으로 힌트라는 기능이 제공된다. MySQL서버에서 가능한 쿼리 힌트는? 인덱스 힌트: 예전 버전에서 사용되던 힌트들 ex) USE INDEX, STRAIGHT_JOIN 옵티마이저 힌트 ex) MySQL 5.6 부터 새롭게 추가되기 시작한 힌트들을 뜻한다. STRAIGHT_JOIN 도 포함한다. 9.4.1 인덱스 힌트 USE INDEX, STRAIGHT_JOIN 등을 포함한 인덱스 힌트들은 모두 MySQL 서버에 옵티마이저 힌트가 도입되기 전에 사용되던 기능들이다. 이들은 모두 SQL 문법에 맞게 사용해야되므로 사용하게 ..

Chapter 09.03 고급 최적화

9.3 고급 최적화 옵티마이저는 통계 정보와 옵티마이저 옵션을 결합해서 최적의 계획을 수립한다. 옵티마이저 옵션 조인 관련 옵티마이저 옵션 옵티마이저 스위치 옵티마이저 스위치: MySQL 서버의 고급 최적화 기능들을 활성화할지를 제어하는 용도이다. 9.3.1 옵티마이저 스위치 옵션 변수 optimizer_switch를 이용한다. 옵티마이저 스위치 이름 batched_key_access (기본값 off) block_nested_loop engine_condition_pushdown index_condition_pushdown use_index_extensions index_merge index_merge_intersection index_merge_sort_union index_merge_union mrr..

Chapter 09.02 기본 데이터 처리

9.2 기본 데이터 처리 모든 RDBMS는 데이터 가공 결과물이 동일하나 처리 과정은 벤더별로 차이가 있다. 기본적인 데이터 가공을 위해서 MySQL 서버가 어떤 알고리즘을 사용하는지 알아본다. 9.2.1 풀 테이블 스캔과 풀 인덱스 스캔 Def) 풀 테이블 스캔 인덱스를 이용하지 않고 테이블의 데이터를 처음부터 끝까지 읽어서 요청된 작업을 처리하는 작업이다. 상당히 많은 디스크 읽기가 필요하다. 대부분의 DBMS는 한꺼번에 여러 개의 블록이나 페이지를 읽어오는 기능을 내장한다. 그러나 MySQL은 한꺼번에 몇 개씩 페이지를 읽어올지 설정하는 시스템 변수는 없다. 풀 테이블 스캔을 실행할 때 MyISAM 스토리지 엔진: 디스크로부터 페이지를 하나씩 읽어온다. InnoDB 스토리지 엔진: 특정 테이블의 연..

Chapter 09.01 옵티마이저(Optimizer)와 힌트

9.1 개요 실행 계획을 이해해야 실행 계획의 불합리한 부분을 찾아내고 더 최적화된 방법으로 실행 계획을 수립하도록 유도 가능하다. Def) 옵티마이저(Optimizer): MySQL은 쿼리를 최적으로 실행하기 위해 데이터가 어떤 분포로 저장돼있는지 통계 정보를 참조한다. 기본 데이터를 비교해서 최적의 실행 계획을 수립하는 작업을 말한다. MySQL 서버를 포함한 대부분의 DBMS에서 이러한 기능을 담당한다. 명령어 EXPLAIN으로 쿼리 실행 계획을 확인할 수 있다. 9.1.1 쿼리 실행 절차 SQL 파싱(parsing): 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리 (파스 트리)한다. SQL 파서라는 모듈로 처리한다. SQL 문법 검사 SQL 파스 트..

Chapter 08.08 클러스터링 인덱스(Clustering Index)

8.8 클러스터링 인덱스(Clustering Index) 클러스터링: 여러 개를 하나로 묶는다는 의미로 사용한다. Def) 클러스터링: MySQL에서 클러스터링은 테이블의 레코드를 비슷한 것들끼리 묶어서 저장하는 형태로 구현된다. 클러스터링 인덱스는 InnoDB 엔진에서만 지원한다. 8.8.1 클러스터링 인덱스(Clustering Index) Def) 클러스터링 인덱스는 테이블의 프라이머리 키에 대해서만 적용된다. PK가 비슷한 레코들끼리 묶어서 저장하는 것을 말한다. PK 값에 의해서 레코드의 저장 위치가 결정된다. PK값이 변경된다면 레코드의 저장위치가 바뀌어야한다는 뜻이다. PK 값으로 클러스터링된 테이블은 프라이머리 키 값 자체에 대한 의존도가 상당히 크기 때문에 PK를 신중하게 결정한다. 클러스..

Chapter 08.04 R-Tree 인덱스 ~ 08.05 전문 검색 인덱스

8.5 전문 검색 인덱스(Full text Search Index) Def) 전문 검색 인덱스: 문서 전체에 대한 분석과 검색을 위한 인덱싱 알고리즘을 말한다. B-Tree인덱스는 실제 칼럼의 값이 1MB 이더라도 1MB 전체의 값을 인덱스 키로 사용하는 게 아니라 1000 바이트(MyISAM) 또는 3072바이트(InnoDB)까지만 잘라서 인덱스 키로 사용한다. B-Tree인덱스는전체 일치나 좌측 일부 일치와 같은 검색만 가능하다. 문서 내용 전체를 인덱스화해서 특정 키워드가 포함된 문서를 검색하는 전문(FullText )검색에는 InnoDB나 MyISAM 스토리지 엔진에서 제공하는 일반적 용도의 B-Tree인덱스를 사용할 수 없다. 8.5.1 인덱스 알고리즘 전문 검색에서는 문서 본문 내용에서 사용자..

Chapter 08.03 B-Tree 인덱스

8.3 B-Tree 인덱스 B-Tree는 칼럼의 원래 값을 변형하지 않고 인덱스 구조체 내에서는 항상 정렬된 상태로 유지한다. 전문 검색 같은 특수 상황이 아닌 경우, 대부분 B-Tree를 사용한다. B-Tree는 데이터베이스 인덱싱 알고리즘 가운데 가장 일반적으로 사용되고, 가장 먼저 도입된 알고리즘이다. 현재도 가장 범용적인 목적으로 사용된다. 일반적으로 B+-Tree, B*-Tree 가 사용된다. B-Tree의 B는 "balanced"를 의미한다. 8.3.1 구조 및 특성 B-Tree는 트리 구조에서 최상위에 하나의 루트노드가 존재하고 그 하위에 자식 노드가 붙어 있는 형태이다. 트리 구조에서 가장 하위의 노드: 리프 노드(leaf node) 루트 노드도 아니고 리브 노드도 아닌 노드: 브랜치 노드..

Chapter 08.01 디스크 읽기 방식 ~ 08.02 인덱스란?

8.1 디스크 읽기 방식 컴퓨터의 CPU나 메모리처럼 전기적 특성을 띤 장치의 성능을 빠른속도로 발전했으나 디스크같은 기계식 장치의 성능은 제한적으로 발전했다. 최근에는 하드디스크보다 SSD드라이브를 많이 사용하지만 여전히 데이터 저장 매체는 컴퓨터에서 가장 느린 부분이다. 8.1.1 하드 디스크 드라이브(HDD)와 솔리드 스테이트 드라이브(SSD) 컴퓨터에서 CPU나 메모리같은 주요 장치는 대부분 전자식 장치지만 하드 디스크 드라이브는 기계식 장치이다. 그래서 데이터베이스 서버에서는 항상 디스크 장치가 병목이 된다. 이런 HDD를 대체하기 위해 SSD가 많이 출시되고 있다. SSD는 기존 하드 디스크의 데이터 저장용 플래터(원판)을 제거하고 그 대신 플래시 메모리를 장착하고 있다. HDD처럼 원판을 회..

Chapter 05. 트랜잭션과 잠금

5.1 트랜잭션 트랜잭션이란 작업의 완전성을 보장해주는 것이다. 논리적인 작업 셋을 모두 완벽 처리하거나 처리하지 못할 때에는 원 상태로 복구해서 작업의 일부만 적용되는 현상(partial update)이 발생하지 않도록 만들어주는 기능이다. MyISAM은 트랜잭션이 지원되지 않는다. 잠금(Lock)과 트랜잭션의 차이 잠금: 동시성을 제어하는 기능이다. ex) 여러 커넥션에서 하나의 데이터를 동시에 수정하려고 하는 경우에 적용하는 기능 트랜잭션: 데이터의 정합성을 보장하기 위한 기능이다. 격리 수준: 하나의 트랜잭션 내에서 또는 여러 트랜잭션 간의 작업 내용을 어떻게 공유하고 차단할 것인지를 결정하는 레벨을 의미한다. 데이터의 정합성(consistency): 데이터가 모순없이 일관되어야한다. 5.1.1 ..