728x90
반응형

CS 92

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

MySQL 시스템 변수 특징 / 글로벌 변수와 세션 변수 / 정적 변수와 동적 변수 / SET PERSIST

MySQL 서버는 기동하면서 설정 파일의 내용을 읽어 메모리나 작동 방식을 초기화하고, 접속된 사용자를 제어하기 위해 이러한 값을 별도로 저장해 둔다. MySQL 서버에서는 이렇게 저장된 값을 시스템 변수(System Variables)라고 한다. 각 시스템 변수는 MySQL 서버에서 아래 명령어로 확인할 수 있다. $ mysql > SHOW GLOBAL VARIABLES; 시스템 변수(설정) 값이 어떻게 MySQL 서버와 클라이언트에 영향을 미치는지 판단하려면 각 변수가 글로벌 변수인지 세션 변수인지 구분할 수 있어야 한다. ▶ 시스템 변수가 가지는 5가지 속성 Cmd-Line : MySQL 서버의 명령행 인자로 설정될 수 있는지 여부를 나타낸다. 즉, 이 값이 "Yes"이면 명령행 인자로 이 시스템 ..

CS/MySQL 2023.06.21

MySQL 5.7에서 MySQL 8.0 업그레이드 고려사항 및 차이점, MySQL 서버 설정

▶ MySQL 8.0 업그레이드 시 고려 사항 MySQL 8.0에서는 상당히 많은 기능들이 개선되거나 변경 됐다. 그 중에서도 MySQL 5.7 버전과 8.0 버전의 기본적인 부분의 차이점과 MySQL 8.0버전의 기본적인 부분의 차이점과 MySQL 8.0에서는 사용할 수 없는 기능들이 몇 가지 있다. 그래서 반드시 MySQL 8.0으로 업그레이드하기 전에 아래 내용이 영향을 미치지 않는지 검토해 봐야 한다. 사용자 인증 방식 변경 : MySQL 8.0 버전부터는 Caching SHA-2 Authentication 인증 방식이 기본 인증 방식으로 바뀌었다. MySQL 5.7에 존재했던 사용자 계정은 여전히 Native Authentication 인증 방식을 사용하겠지만 MySQL 8.0 버전에서 별도의 ..

CS/MySQL 2023.06.21
728x90
반응형