본문 바로가기

분류 전체보기

(319)
MySQL의 기본 -10 랜덤 I/O랜덤 I/O는 데이터가 디스크 내 임의의 위치에서 읽히거나 써지는 방식을 의미한다. 이러한 비연속적 데이터 접근은 디스크 헤드가 여러 위치로 이동해야 하므로 탐색 시간이 증가해 전반적인 입출력 속도를 저하시킨다. 특히 HDD에서는 회전하는 플래터 위에서 디스크 헤드가 데이터 위치로 물리적으로 이동하고 회전 대기 시간까지 겹쳐져 성능 저하가 심각하다. 반면 SSD는 플래터와 헤드가 없으므로 랜덤 I/O에 상대적으로 강하지만, 여전히 작은 단위의 많은 I/O 요청은 오버헤드를 유발한다. 랜덤 I/O의 대표적인 예로는 B-Tree 인덱스 탐색과 조인(Join) 수행 시 데이터가 여러 위치에서 불규칙하게 읽히는 경우가 있다. 예를 들어, 특정 id 값을 찾기 위해 인덱스를 따라가다 보면 다양한 블록을..
MySQL의 기본 -9 클러스터링 인덱스(Clustered Index) 추가 설명 클러스터링 인덱스는 테이블의 프라이머리 키(Primary Key)를 기준으로 데이터 레코드의 물리적 순서가 정해지는 방식입니다. InnoDB 스토리지 엔진은 모든 테이블에 대해 기본적으로 클러스터링 인덱스를 사용합니다. 이를 통해 데이터의 물리적 저장 순서가 프라이머리 키에 의해 결정되며, 다른 인덱스들은 이를 기반으로 세컨더리 인덱스(Secondary Index)를 생성합니다. 클러스터링 인덱스의 특징 프라이머리 키 기반 저장 프라이머리 키가 클러스터링 인덱스의 기준이 됩니다. 프라이머리 키 값에 따라 테이블의 레코드가 물리적으로 저장됩니다. 즉, 레코드는 프라이머리 키 순서대로 저장됩니다. 리프 노드에 모든 데이터 포함 B-Tre..
MySQL의 기본 -8 MySQL이 인덱스를 어떻게 이용하는가?인덱스 레인지 스캔MySQL에서는 검색하려는 값의 개수나 검색 결과의 레코드 건수와 관계 없이, 특정 범위를 스캔하게 된다면 레인지 스캔이라고 표현한다. 인덱스 레인지 스캔(Index Range Scan)은 검색해야 할 인덱스의 범위가 결정됐을 때 사용하는 방식이다. 레인지 스캔을 수행할 때는 B-Tree 인덱스의 리프 노드를 스캔하면서, 실제 데이터 파일에서 레코드를 읽어오는 과정이 필요할 수도 있다. 이 과정에서 다수의 랜덤 I/O가 발생할 수 있으므로, 경우에 따라 테이블 풀 스캔(Table Full Scan)이 더 효율적일 수도 있다.과정1. 인덱스 탐색(Index Lookup)B-tree 인덱스에서 루트 노드와 브랜치 노드를 이용해 탐색을 시작할 위치를 찾..
MySQL의 기본 -7 클러스터형 인덱스(Clustered Index)란 무엇인가 클러스터형 인덱스란 테이블의 실제 데이터 레코드가 인덱스 키 값의 순서대로 물리적으로 정렬되어 저장되는 인덱스 구조를 말합니다. 이 방식은 데이터가 정렬된 상태로 저장되기 때문에, 특정 범위에 해당하는 값을 빠르게 검색할 수 있다는 큰 장점이 있습니다. 예를 들어, 날짜나 ID 범위처럼 연속적인 값을 조건으로 하는 쿼리는 클러스터형 인덱스 덕분에 매우 빠른 속도로 처리됩니다. MySQL의 InnoDB 스토리지 엔진은 모든 테이블에 대해 반드시 하나의 클러스터형 인덱스를 사용합니다. 이 인덱스는 기본적으로 PRIMARY KEY에 대해 자동으로 생성되며, 테이블의 실제 데이터 페이지가 항상 PRIMARY KEY 값 기준으로 정렬되어 저장됩니다. 따라..
MySQL의 기본 -6 B-Tree 인덱스의 구조와 실제 저장 방식 B-Tree 인덱스는 데이터베이스에서 가장 널리 사용되는 인덱스 구조로, 인덱스 키 값이 항상 정렬된 상태로 관리된다는 특징이 있습니다. 즉, 인덱스가 적용된 컬럼의 값은 B-Tree 구조체 내에서 자동으로 오름차순(혹은 내림차순)으로 정렬되어 저장되고, 이 덕분에 빠르고 효율적인 탐색이 가능해집니다. 하지만 여기서 한 가지 오해하기 쉬운 점은, 인덱스의 키 값이 정렬되어 있다고 해서 데이터 파일 자체의 레코드도 항상 같은 순서로 저장된다는 것은 아니라는 점입니다. 많은 분들이 데이터가 INSERT된 순서대로 물리적으로 저장된다고 생각하지만, 실제로는 삭제와 재삽입, 빈 공간 재사용 등의 과정 때문에 데이터 파일 내 레코드는 임의의 순서로 저장될 수 있습니다...
MySQL의 기본 -5 인덱스(Index)인덱스는 sortedList처럼 처음 넣을 때 부터 정렬을 해서 데이터를 저장하기 때문에, INSERT, UPDATE, DELETE 의 성능을 희생하고 대신 select로 데이터 읽어오는 속도가 빠르다. 인덱스의 구조와 SELECT 성능 향상 원리 인덱스가 존재하면, 테이블의 데이터가 마치 sorted list처럼 미리 정렬된 상태로 저장되고 관리됩니다. 이로 인해 데이터 삽입, 삭제, 갱신 시에는 정렬된 구조를 유지해야 하므로 어느 정도의 성능 저하가 불가피하지만, 그 대신 SELECT 쿼리는 데이터 조회 시 압도적으로 빠른 성능을 제공합니다. 왜 인덱스를 사용하면 SELECT 속도가 빨라질까? 대표적으로 MySQL InnoDB는 B-Tree(균형 트리) 자료구조를 인덱스에 사용합니다..
MySQL의 기본 -4 InnoDB 버퍼 풀과 리두 로그의 역할 InnoDB의 버퍼 풀(Buffer Pool)은 데이터 캐시와 쓰기 버퍼링이라는 두 가지 핵심 역할을 담당합니다. 즉, 자주 사용되는 데이터와 인덱스 정보를 메모리에 미리 올려두고(캐시), INSERT, UPDATE, DELETE와 같은 변경 작업도 디스크에 즉시 기록하지 않고 일정 시간 메모리(버퍼 풀)에서 지연·집계 후 한꺼번에 기록함으로써 전체 데이터베이스 서버의 성능을 크게 향상시킵니다.버퍼 풀의 데이터 상태: 클린 페이지와 더티 페이지 버퍼 풀에는 클린 페이지(Clean Page, 디스크와 동일한 데이터)와 더티 페이지(Dirty Page, 메모리에서만 변경된 상태로 디스크와 불일치) 가 함께 존재합니다. 더티 페이지는 디스크에 기록되지 않은 변경사항을 ..
MySQL의 기본 -3 InnoDB 버퍼 풀(Buffer Pool)의 역할InnoDB의 버퍼 풀은 디스크에 저장된 데이터 파일과 인덱스 정보를 메모리에 캐싱하는 MySQL의 핵심 공간입니다. 단순히 데이터를 빠르게 읽어오는 캐시 역할을 넘어, 쓰기 작업을 메모리에 모아뒀다가 한 번에 디스크로 보내는 Write Buffer의 역할도 함께 수행합니다.일반적으로 INSERT, UPDATE, DELETE와 같은 변경 쿼리는 디스크의 여기저기 위치한 레코드에 랜덤하게 접근합니다. 하지만 InnoDB는 이런 랜덤 I/O를 버퍼 풀에 먼저 반영합니다. 그 이후 변경된 데이터 페이지를 모아서 디스크에 기록하면서 실제 디스크 접근의 횟수와 비용을 크게 줄일 수 있습니다.버퍼 풀(Buffer Pool)의 크기 설정버퍼 풀의 크기는 MySQL의 ..