목록CS/DB (9)
빙응의 공부 블로그

대부분의 DBMS는 많은 데이터를 안전하게 저장 및 관리하고 사용자가 원하는 데이터를 빠르게 조회하는 것이 목적이다.이러한 목적 달성을 위해 옵티마이저가 사용자의 쿼리를 효율적으로 처리하는 실행 계획을 수립해야 한다. 하지만 옵티마이저가 관리자나 사용자의 개입 없이 항상 좋은 실행 계획을 만들어내는 것이 아니기에 EXPLAIN 명령어를 통해 옵티마이저가 수립한 실행 계획을 확인할 수 있게 해준다. 하지만 MySQL 서버에서 실행 계획을 이해하려면 MySQL 서버가 데이터를 처리하는 로직을 이해해야 한다 📝10.1 통계 정보MySQL 8.0 버전부터 인덱스되지 않은 칼럼들에 대해 데이터 분포도를 수집하여 저장하는 히스토그램 정보가 도입되었다.히스토그램이 도입됐다고 기존의 테이블이나 인덱스의 통계정보를 필..

MySQL 서버로 요청된 쿼리는 결과가 동일하지만 내부적으로 결과를 만들어내는 방법은 다양하다.쿼리를 최적 실행을 위한 옵티마이저에 대해 알아보자 📝9.1 개요어떤 DBMS든지 쿼리의 실행 계획을 수립하는 옵티마이저는 가장 복잡한 부분이다. 하지만 실행 계획을 이해할 수 잇어야만 실행 계획의 불합리한 부분을 찾아내고, 더 최적화된 방법으로 실행 계획을 수립하도록 유도할 수 있다. 🧷9.1.1 쿼리 실행 절차MySQL 서버에서 쿼리가 실행되는 과정은 크게 세 단계로 나눌 수 있다.사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리(파스 트리)한다.SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.두..

📝8.4 R-Tree 인덱스아마도 MySQL의 공간 인덱스라는 말을 한 번쯤은 들어본 적이 있을 것이다. 공간 인덱스는 R-Tree 인덱스 알고리즘을 이용한 2차원 데이터를 인덱싱하고 검색하는 목적의 인덱스이다. 기본 내부 메커니즘은 B-Tree와 흡사하다. 그러나 R-Tree는 칼럼의 값이 2차원의 공간 개념 값이다. 그렇다면 왜 쓰는 것일까?최근 GPS나 지도 서비스를 내장하는 스마트 폰이 대중화되면서 GIS와 GPS 기반의 서비스가 많아졌다. 이러한 위치 기반의 서비스를 구현하는 방법은 여러 가지가 있겠지만 MySQL의 공간 확장을 이용하면 간단하게 구현 가능하다. 아래는 공간확장의 기능이다.공간 데이터를 저장하는 데이터 타입 지원공간 데이터 검색을 위한 공간 인덱스공간 데이터의 연산 함수 ?..

인덱스는 데이터베이스 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분입니다. 이번 장에서는 MySQL 쿼리의 개발이나 튜닝을 설명하기 전에 인덱스의 종류와 특성을 알아보겠습니다. 📝8.1 디스크 읽기 방식인데스에서만 사용하는 용어는 아니지만 이번 장에서는 랜덤 I/O와 순차 I/O 같은 디스크 일기 방식부터 알아봅시다. 컴퓨터의 CPU나 메모리처럼 전기적 특성을 지닌 장치는 매우 빠른 속도로 발전했지만 디스크 같은 기계식 장치의 성능은 상당히 제한적으로 발전했습니다. 데이터베이스나 쿼리 튜닝에 어느 정도 지식을 갖춘 사용자가 절감하고 있듯이 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건입니다. 🧷8.1.1 하드 디스크 드라이브(HDD)와 솔리드 스테이트 드라이브(SSD)컴퓨터에서 C..

이번 장에서는 MySQL 동시성에 영향을 미치는 잠금, 트랜잭션, 트랜잭션 격리 수준에 대해 알아보겠습니다. 트랜잭션은 작업의 완전성을 보장해주는 것으로 논리적인 작업을 모두 완벽하게 처리하거나 모두 적용 안되게 만들어 주는 기능입니다. 잠금과 트랜잭션은 서로 비슷한 개념 같지만 사실 잠금은 동시성 제어를 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하는 기능입니다. 하나의 회원 정보 레코드를 여러 커넥션에서 동시에 변경하려고 하는데 잠금이 없다면 하나의 데이터를 여러 커넥션이 동시에 변경하게 됩니다. 결과적으로 해당 레코드의 값을 예측할 수 없는 상태가 되기 때문에 순서대로 한 시점에 하나씩 변경하는 역할을 합니다. 격리 수준이라는 것은 하나의 트랜잭션 내에서 또는 여러 트랜잭션 간의 작업 내용을 어..

📝4.2 InnoDB 스토리지 엔진 아키텍처MySQL의 스토리지 엔진 가운데 가장 많이 사용하는 InnoDB 스토리지 엔진에 대해 살펴봅시다. InnoDB 스토리지 엔진은 MySQL 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어납니다. 🧷4.2.1 프라이머리 키에 의한 클러스터링InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준을 클러스터링되어 저장됩니다.즉, PK를 기준으로 순서대로 디스크에 저장된다는 뜻입니다. 모든 세컨더리 인덱스(클러스터링 인덱스 제외 모든 인덱스)는레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용합니다. 그렇기에 테이블에는 기본적인 기본키 인덱스가 존재하여 범위 스캔에 대..