본문 바로가기

전체 글161

[DB] MySQL Group By 처리 방식 Using temporary는 GROUP BY 등을 처리할 때 내부 임시 테이블을 생성하여 중간 결과를 저장하고 그룹화를 수행하는 경우 나타난다. GROUP BY는 같은 값을 가진 레코드를 하나로 묶어야 하므로, 대상 데이터가 늘어날수록 그룹화 처리 비용도 급격히 증가하게 된다.이때 MySQL은 인덱스에 데이터가 이미 정렬되어 저장되어 있다는 특성을 활용하여 불필요한 정렬 연산을 생략하고 그룹화를 효율적으로 처리할 수 있다.이번 글에서는 MySQL 옵티마이저가 GROUP BY를 처리하는 대표적인 세 가지 방식인 Loose Index Scan, Tight Index Scan, 임시 테이블 방식에 대해 알아보겠다. 1. Loose Index Scan인덱스의 모든 값을 읽지 않고 각 그룹에서 필요한 일부 값만.. 2026. 8. 14.
[DB] 페이징 조회는 왜 뒤로 갈수록 느려질까? 페이징을 적용하여 데이터를 조회하다 보면 앞쪽 페이지는 빠르게 조회되지만 뒤쪽 페이지로 갈수록 조회 속도가 느려지는 경우가 있다.왜 이런 문제가 발생할까? Offset Pagination일반적인 페이징은 LIMIT, OFFSET을 이용하여 구현할 수 있다.예를 들어 한 페이지에 20개의 데이터를 조회한다면 첫 번째 페이지와 10,001번째 페이지의 쿼리는 다음과 같다.SELECT * FROM post ORDER BY created_at DESC LIMIT 20 OFFSET 0;SELECT * FROM post ORDER BY created_at DESC LIMIT 20 OFFSET 200000; 페이지가 뒤로 갈수록 OFFSET 값 역시 커지는데, 여기서 중요한 점은 MySQL이 OFFSET 200000.. 2026. 8. 13.
github-label-sync로 라벨 한 번에 설정하기 GitHub에서 새로운 프로젝트를 생성할 때마다 동일한 라벨을 반복해서 설정하는 과정이 번거로웠다.찾아보니 github-label-sync를 사용하면 GitHub 저장소의 라벨을 한 번에 생성하거나 동기화할 수 있었고, 이번 글에서 사용 방법을 정리해보려 한다. 1. 깃허브 토큰 발급먼저 GitHub 저장소의 라벨을 변경하기 위해서는 GitHub Personal Access Token을 발급받아야 한다.GitHub의 Settings > Developer settings > Personal access tokens > Tokens (classic) > Generate new token (classic)으로 이동한 뒤, repo 권한을 체크하여 토큰을 생성한다. 2. labels.json 파일 생성프로젝트에.. 2026. 8. 9.
[DB] MySQL 옵티마이저는 어떻게 실행 계획을 선택할까? MySQL은 하나의 쿼리를 실행할 때 여러 실행 방법 중 가장 효율적이라고 판단되는 실행 계획을 선택한다.그렇다면 옵티마이저는 어떤 기준으로 실행 계획의 비용을 판단하고 선택할까?이번 글에서는 MySQL의 비용 기반 옵티마이저가 실행 계획을 선택하는 과정과 그 판단의 기반이 되는 통계 정보, 히스토그램의 개념​에 대해 간단하게 정리해보려 한다. 비용 기반 옵티마이저MySQL의 옵티마이저는 여러 실행 계획의 예상 비용을 계산하고, 비용이 가장 낮은 실행 계획을 선택하는 비용 기반 옵티마이저이다.옵티마이저가 계산하는 비용에는 크게 다음과 같은 작업들이 포함된다.디스크 또는 버퍼 풀에서 페이지를 읽는 I/O 비용레코드를 읽고 조건을 비교하거나 평가하는 CPU 연산 비용이러한 비용을 계산할 때 기준으로 사용하는.. 2026. 8. 9.
[DB] MySQL의 다양한 최적화 방법 (2) - 인덱스 머지, MRR(Multi Range Read) 2026.08.07 - [Database] - [DB] MySQL의 다양한 최적화 방법 (1) - ICP, Index Skip Scan이전 글에서는 ICP와 Index Skip Scan을 통해 MySQL이 인덱스를 효율적으로 활용하는 방법에 대해 알아보았다. 이번 글에서는 하나의 인덱스만으로 조건을 효율적으로 처리하기 어려운 경우 사용할 수 있는 Index Merge와, 데이터 접근 과정에서 랜덤 I/O를 줄이기 위한 MRR(Multi-Range Read) 에 대해 알아보려고 한다. Index MergeMySQL은 일반적으로 하나의 테이블을 조회할 때 하나의 인덱스를 선택하여 사용한다.그렇다면 다음과 같이 서로 다른 컬럼에 대한 조건이 존재하고, 각각 별도의 인덱스가 생성되어 있다면 어떤 인덱스를 사용해.. 2026. 8. 7.
[DB] MySQL의 다양한 최적화 방법 (1) - ICP, Index Skip Scan MySQL을 공부하면서 인덱스가 단순히 데이터를 빠르게 찾기 위한 기능에 그치지 않고, 내부적으로 다양한 최적화 기법을 통해 효율적으로 동작한다는 것을 알게 되었다.특히 인덱스가 동작하는 방식을 살펴보던 중 ICP(Index Condition Pushdown) 와 Index Skip Scan이라는 최적화 기법을 알게 되었고, 실제 MySQL 내부에서는 쿼리들이 어떻게 처리되는지 궁금증이 생겼다.따라서 이번 글에서는 MySQL의 구조를 살펴본 뒤, ICP와 Index Skip Scan이 어떤 방식으로 동작하며 인덱스 활용을 어떻게 최적화하는지 간단하게 알아보려고 한다. MySQL은 크게 MySQL 엔진과 스토리지 엔진 두 개의 레이어로 구성된다. 1. MySQL 엔진커넥션 핸들러 클라이언트의 접속 요청을.. 2026. 8. 7.
[DB] B+Tree 내부 구조 이해하기 [Database] B-Tree 개념과 동작 원리B-Tree는 이진 탐색 트리를 확장한 자료구조로, 디스크 I/O를 최소화하기 위해 한 노드에 여러 개의 키를 저장하는 균형 트리이다.데이터베이스는 데이터를 페이지 단위로 읽는다. 단 한 행만 읽으hbb-devlog.tistory.com이전 글에서는 B-Tree의 개념과 조회, 삽입, 삭제 과정에 대해 간략히 알아보았다.B-Tree는 모든 연산을 O(log N)에 수행할 수 있는 효율적인 자료구조이지만, 데이터베이스 인덱스로 사용하기에는 몇 가지 한계가 존재한다.이러한 한계를 해결하기 위해 대부분의 데이터베이스는 B+Tree를 인덱스 자료구조로 사용한다.이번 글에서는 B+Tree가 B-Tree와 어떻게 다른지, 그리고 왜 데이터베이스가 B+Tree를 선택했.. 2026. 8. 4.
[DB] EXPLAIN ANALYZE로 실행 계획 분석하기 [Database] 인덱스와 EXPLAIN 이해하기인덱스란 데이터베이스에서 검색 속도를 높이기 위해 특정 컬럼을 기준으로 생성한 별도의 자료구조이다.원본 테이블을 그대로 사용하는 것이 아니라, 인덱스로 선택된 컬럼 값과 해당 행의 위hbb-devlog.tistory.com이전 글에서는 인덱스와 EXPLAIN을 통해 MySQL 실행 계획을 확인하는 방법을 알아보았다.하지만 EXPLAIN은 실제 쿼리를 실행하지 않고, 옵티마이저가 통계 정보를 바탕으로 추정한 실행 계획만을 보여주기 때문에 실제 실행 결과와 차이가 발생할 수 있다.이러한 한계를 보완하기 위해 MySQL은 EXPLAIN ANALYZE를 제공하는데, EXPLAIN ANALYZE는 실행 계획과 함께 실제 쿼리의 실행 정보를 제공하여 실행 계획을 더.. 2026. 8. 4.
vi 에디터 기본 사용법 정리 리눅스를 사용하다 보면 vi 에디터를 자주 사용하게 되는데, 명령어를 매번 검색하게 되어 자주 사용하는 기능들을 정리해두려고 한다.vi 에디터는 리눅스 환경에서 가장 많이 사용되는 텍스트 편집기 중 하나로, 입력 모드와 명령 모드를 구분하여 사용한다.입력 모드에서는 텍스트를 작성할 수 있고, 명령 모드에서는 커서 이동, 복사, 삭제, 검색 등의 작업을 수행할 수 있다.처음 vi 에디터를 실행하면 기본적으로 명령 모드 상태이다. 1. 입력 모드 진입명령어설명i현재 커서 위치부터 입력I현재 줄의 맨 앞에서 입력A현재 줄의 맨 끝에서 입력O현재 줄 위에 새로운 줄 생성 후 입력S현재 줄 전체를 삭제하고 입력 2. 커서 이동명령어설명gg파일의 첫 번째 줄로 이동G파일의 마지막 줄로 이동^현재 줄의 첫 번째 문.. 2026. 6. 16.