728x90
반응형

CS/MySQL 13

MySQL DISTINCT 처리, 임시테이블이 필요한 쿼리

특정 칼럼의 유니크한 값만 조회하려면 SELECT 쿼리에 DISTINCT를 사용한다. DISTINCT는 MIN(), MAX() 또는 COUNT() 같은 집합 함수와 함께 사용되는 경우와 집합 함수가 없는 경우의 2가지로 구분해서 살펴볼 수 있다. 위 2가지로 구분하는 이유는 각 경우에 DISTINCT 키워드가 영향을 미치는 범위가 달라지기 때문이다. 그리고 집합 함수와 같이 DISTINCT가 사용되는 쿼리의 실행 계획에서 DISTINCT 처리가 인덱스를 사용하지 못할 때는 항상 임시 테이블이 필요하다. ▶ SELECT DISTINCT ... 단순히 SELECT 되는 레코드 중에서 유니크한 레코드만 가져오고자 하면 SELECT DISTINCT 형태의 쿼리 문장을 사용한다. 이 경우에는 GROUP BY와 동..

CS/MySQL 2023.07.14

MySQL 옵티마이저란? MySQL 기본 데이터 처리 [ORDER BY - 소트 버퍼, 정렬 방식]

MySQL에서도 쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장돼 있는지 통계 정보를 참조하며, 그러한 기본 데이터를 비교해 최적의 실행 계획을 수립하는 작업이 필요하다. MySQL 서버를 포함한 대부분의 DBMS에서는 옵티마이저가 이러한 기능을 담당한다. ▶ 쿼리 실행 절차 MySQL 서버에서 쿼리가 실행되는 과정은 크게 세 단계로 나눌 수 있다. 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리(파스 트리)한다. SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블로부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다. 두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다...

CS/MySQL 2023.07.12

MySQL B-Tree 인덱스 [2/2]

▶ B-Tree 인덱스를 통한 데이터 읽기 ◎ 인덱스 레인지 스캔 인덱스 접근 방법 중 가장 대표적인 방법으로 가장 빠른 방법 인덱스를 통해 레코드를 한 건만 읽는 경우와 한 건 이상을 읽는 경우를 각각 다른 이름으로 구분하지만 모두 "인덱스 레인지 스캔"이라 표현인덱스 레인지 스캔은 검색해야 할 인덱스의 범위가 결정됐을 때 사용하는 방식이다. 검색하려는 값의 수나 검색 결과 레코드 건수와 관계없이 레인지 스캔이라고 표현한다. 위 그림에서 알 수 있듯 루트 노드에서부터 비교를 시작해 브랜치 노드를 거치고 최종적으로 리프 노드까지 찾아 들어가야만 비로소 필요한 레코드의 시작 지점을 찾을 수 있다. 일단 시작해야 할 위치를 찾으면 그때부터는 리프 노드의 레코드만 순서대로 읽으면 된다. 만약 스캔하다가 리프 ..

CS/MySQL 2023.07.06

MySQL 인덱스(index)와 B-Tree 인덱스 [1/2]

인덱스는 데이터베이스 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분이다. 각 인덱스의 특성과 차이는 상당히 중요하며, 물리 수준의 모델링을 할 때도 중요한 요소가 될 것이다. ▶ 디스크 읽기 방식 인덱스를 시작하기 전 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건이냐이기 때문에 사전 지식으로 "랜덤(Random) I/O", "순차(Sequential) I/O" 방식에 대해 이해해야 한다. ▶ 하드 디스크 드라이브(HDD)와 솔리드 스테이트 드라이브(SSD) 컴퓨터에서 CPU나 메모리 같은 주요 장치는 대부분 전자식 장치지만 하드 디스크 드라이브는 기계식 장치다. 그래서 데이터베이스 서버에서는 항상 디스크 장치가 병목이 된다. 물리적 방식으로 데이터를 읽고 쓰는 HDD보다 플래시 메모리..

CS/MySQL 2023.07.05

MySQL 데이터 압축 (페이지 압축, 테이블 압축)

MySQL 서버에서 디스크에 저장된 데이터 파일의 크기는 일반적으로 쿼리의 처리 성능과도 직결되지만 백업 및 복구 시간과도 밀접하게 연결된다. 디스크의 데이터 파일이 크면 클수록 쿼리를 처리하기 위해서 더 많은 데이터 페이지를 InnoDB 버퍼 풀로 읽어야 할 수도 있고, 새로운 페이지가 버퍼 풀로 적재되기 때문에 그만큼 더티 페이지가 더 자주 디스크로 기록돼야 한다. 그리고 데이터 파일이 크면 클수록 백업 시간이 오래 걸리며, 복구하는 데도 그만큼의 시간이 걸린다. 물론 그만큼의 저장 공간이 필요하기 때문에 비용 문제도 있을 수 있다. 많은 DBMS가 이런 문제점을 해결하기 위해 데이터 압축 기능을 제공한다. MySQL 서버에서 사용 가능한 압축 방식은 크게 테이블 압축과 페이지 압축의 두 가지 종류로..

CS/MySQL 2023.07.03

MySQL InnoDB 스토리지 엔진 잠금과 MySQL 격리 수준

InnoDB 스토리지 엔진은 MySQL에서 제공하는 잠금과는 별개로 스토리지 엔진 내부에서 레코드 기반의 잠금 방식을 탑재하고 있다. InnoDB는 레코드 기반의 잠금 방식 때문에 MyISAM보다는 훨씬 뛰어난 동시성 처리를 제공할 수 있다. ▶ InnoDB 스토리지 엔진의 잠금 InnoDB 스토리지 엔진은 레코드 기반의 잠금 기능을 제공하며, 잠금 정보가 상당히 작은 공간으로 관리되기 때문에 레코드 락이 페이지 락으로, 또는 테이블 락으로 레벨업되는 경우(락 에스컬레이션)는 없다. 일반 상용 DBMS와는 조금 다르게 InnoDB 스토리지 엔진에서는 레코드 락뿐 아니라 레코드와 레코드 사이의 간격을 잠그는 갭(GAP) 락이라는 것이 존재하는데, 아래 그림은 InnoDB 스토리지 엔진의 레코드 락과 레코드..

CS/MySQL 2023.07.02

MySQL 트랜잭션이란? MySQL 잠금(Lock)

이번 게시글은 MySQL의 동시성에 영향을 미치는 잠금(Lock)과 트랜잭션, 트랜잭션의 격리 수준(Isolation level)에 관한 내용이다. 트랜잭션은 작업의 완전성을 보장해 주는 것이다. 즉 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상(Partial update)이 발생하지 않게 만들어주는 기능이다. 잠금(Lock)과 트랜잭션은 서로 비슷한 개념 같지만 사실 잠금은 동시성을 제어하기 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하기 위한 기능이다. → 잠금은 여러 커넥션에서 동시에 동일한 자원(레코드나 테이블)을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할을 한다. → 격리 수준이라는 것..

CS/MySQL 2023.07.01

MySQL InnoDB 스토리지 엔진 아키텍처 / MVCC / 자동 데드락 감지 / 자동화 장애 복구

InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적아며 성능이 뛰어나다. ※ 레코드 기반 잠금이란? 레코드 기반 잠금은 데이터베이스의 특정 레코드(행)에 대한 잠금을 수행하는 방식이다. InnoDB에서는 각 레코드를 잠그는 대신, 데이터 페이지(page)를 잠그는 페이지 수준 잠금(page-level locking)과는 다른 방식을 사용한다. 레코드 기반 잠금은 다음과 같은 특징을 갖는다. 세밀한 잠금 : InnoDB는 트랜잭션 내에서 필요한 레코드만을 잠그므로 다른 트랜잭션은 동일한 테이블에서 다른 레코드를 조작할 수 있다. 이는 동시성을 향상시키고 락 경합(lock contention)을 감소시킨다..

CS/MySQL 2023.06.25

MySQL 쿼리 실행 구조 / MySQL 복제 / 트랜잭션 지원 메타 데이터(MySQL 5.7 vs 8.0)

※ 쿼리 실행 구조 위 그림은 쿼리를 실행하는 관점에서 MySQL의 구조를 간략하게 그림으로 나타낸 것이며, 기능별로 나눌 수 있다. ▶ 쿼리 파서 쿼리 파서는 사용자 요청으로 들어온 쿼리 문장을 토큰(MySQL이 인식할 수 있는 최소 단위의 어휘나 기호)으로 분리해 트리 형태의 구조로 만들어 내는 작업을 의미한다. 쿼리 문장의 기본 문법 오류는 이 과정에서 발견되고 사용자에게 오류 메시지를 전달한다. ▶ 전처리기 파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지 확인한다. 각 토큰을 테이블 이름이나 칼럼 이름, 또는 내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인하는 과정을 이 단계에서 수행한다. 실제 존재하지 않거나 권한상 사용할 ..

CS/MySQL 2023.06.23

MySQL 엔진 아키텍처 / 스레딩 구조 / 메모리 할당 및 구조 / 컴포넌트

MySQL 서버는 사람의 머리 역할을 담당하는 MySQL 엔진과 손발 역할을 담당하는 스토리지 엔진으로 구분할 수 있다. 스토리지 엔진은 기본으로 제공되는 InnoDB 스토리지 엔진 / MyISAM 스토리지 엔진으로 구분된다. ▶ MySQL 엔진 아키텍처 MySQL의 쿼리를 작성하고 튜닝할 때 필요한 기본적인 MySQL 엔진의 구조를 훑어본다. MySQL 서버는 크게 MySQL 엔진 / 스토리지 엔진으로 구분 위 아키텍처에 존재하는 여러 구성 요소들을 아래에서 하나 하나 살펴봄 ▶ MySQL 엔진 MySQL 엔진은 클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룸 또한 MySQL은 표준 SQL(ANSISQL)문..

CS/MySQL 2023.06.23
728x90
반응형