개요 MySQL의 InnoDB 스토리지 엔진은 PK에 대해 클러스터링 인덱스를 자동으로 생성합니다. 그렇다면 클러스터링 인덱스 무엇이길래 테이블마다 존재하는 것일까요? 이 글에서 알아봅시다. 클러스터링 인덱스 클러스터링이란 여러 개를 하나로 묶는다는 의미로 사용됩니다. 클러스터링 인덱스도 이러한 의미에서 크게 벗어나지 않습니다. InnoDB에서 클러스터링은 테이블의 레코드를 비슷한 것들끼리(PK 기준) 묶어서 저장하는 형태로 구현됩니다. 이는 주로 비슷한 값들을 동시에 조회하는 경우가 많다는 점에서 착안한 것입니다. 클러스터링 인덱스는 PK에 대해서만 적용됩니다. PK값이 비슷한 레코드끼리 묶어서 저장됩니다. 즉, PK 값에 의해 레코드의 저장 위치가 결정된다는 것입니다. 또한 PK 값이 변경된다면 레코..
칼럼의 값을 변형해서 만들어진 값에 대해 인덱스를 구축할 수 있습니다. MySQL 서버에서 함수 기반 인덱스를 구현하는 방법은 다음과 같습니다. 1. 가상 칼럼을 이용한 인덱스 2. 함수를 이용한 인덱스 함수 기반 인덱스는 인덱싱할 값을 계산하는 과정의 차이만 존재합니다. 가상 칼럼을 이용한 인덱스 다음과 같은 테이블이 있습니다. mysql> CREATE TABLE user( user_id BIG_INT first_name VARCHAR(10), last_name VARCHAR(10), PRIMARY KEY (user_id) ); first_name와 last_name을 합쳐서 검색해야 하는 요건이 생겼습니다. 두 칼럼을 합친 full_name이라는 칼럼을 만들어 인덱스를 생성해도 되지만 다른 방법이 있..
이전 글에 이어서 MySQL의 B-Tree 인덱스에 대해 알아보겠습니다. [MySQL] B-Tree 인덱스 - 1 대표적인 인덱스인 B-Tree 인덱스를 MySQL의 관점에서 알아봅시다. 구조 Tree는 루트 노드와 리프 노드 그 사이에 브랜치 노드로 이루어져 있습니다. 그중 리프 노드에 데이터 레코드의 주솟값을 저 acisliver.tistory.com [MySQL] B-Tree 인덱스 - 2 이전 글에 이어서 B-Tree 인덱스를 MySQL 관점에서 살펴보겠습니다. [MySQL] B-Tree 인덱스 - 1 대표적인 인덱스인 B-Tree 인덱스를 MySQL의 관점에서 알아봅시다. 구조 Tree는 루트 노드와 리프 노드 그 사이 acisliver.tistory.com [MySQL] B-Tree 인덱스 -..
이전 글에 이어서 MySQL의 B-Tree 인덱스에 대해 알아보겠습니다. [MySQL] B-Tree 인덱스 - 1 대표적인 인덱스인 B-Tree 인덱스를 MySQL의 관점에서 알아봅시다. 구조 Tree는 루트 노드와 리프 노드 그 사이에 브랜치 노드로 이루어져 있습니다. 그중 리프 노드에 데이터 레코드의 주솟값을 저 acisliver.tistory.com [MySQL] B-Tree 인덱스 - 2 이전 글에 이어서 B-Tree 인덱스를 MySQL 관점에서 살펴보겠습니다. [MySQL] B-Tree 인덱스 - 1 대표적인 인덱스인 B-Tree 인덱스를 MySQL의 관점에서 알아봅시다. 구조 Tree는 루트 노드와 리프 노드 그 사이 acisliver.tistory.com B-Tree 인덱스의 정렬 및 스캔 ..
이전 글에 이어서 B-Tree 인덱스를 MySQL 관점에서 살펴보겠습니다. [MySQL] B-Tree 인덱스 - 1 대표적인 인덱스인 B-Tree 인덱스를 MySQL의 관점에서 알아봅시다. 구조 Tree는 루트 노드와 리프 노드 그 사이에 브랜치 노드로 이루어져 있습니다. 그중 리프 노드에 데이터 레코드의 주솟값을 저 acisliver.tistory.com B-Tree 인덱스를 통한 데이터 읽기 인덱스를 잘 사용하기 위해서는 MySQL이 인덱스를 통해 어떻게 실제 레코드를 읽는지 알아야 합니다. 여기서는 MySQL이 인덱스를 이용하는 대표적인 방법을 살펴보겠습니다. 인덱스 레인지 스캔 인덱스를 사용하는 가장 대표적이고 가장 빠른 방법입니다. 인덱스 레인지 스캔은 검색해야 할 인덱스의 범위가 결정되었을 때..
대표적인 인덱스인 B-Tree 인덱스를 MySQL의 관점에서 알아봅시다. 구조 Tree는 루트 노드와 리프 노드 그 사이에 브랜치 노드로 이루어져 있습니다. 그중 리프 노드에 데이터 레코드의 주솟값을 저장하는 것이 Tree 자료 구조를 사용한 인덱스입니다. B-Tree의 B는 Balanced의 약자입니다. 여기서 Balance(균형)은 트리의 높이가 균형을 이룬다는 뜻입니다. 균형을 이룬다는 뜻은 루트 노드에서 리프 노드까지의 거리를 일정하게 유지하는 것을 의미합니다. 리프 노드까지의 거리를 균일하게 유지하는 이유는 루트 노드에서 리프 노드까지의 탐색 시간을 줄이기 위해서입니다. 트리가 한쪽으로 편향되어 있다면 브랜치 노드가 많아져 리프노드까지의 탐색 시간이 증가합니다. 이러한 균형 잡힌 트리를 유지하기..
인덱스를 설명하기 전에 디스크 읽기 방식을 설명하고 디스크 읽기 방식이 어떻게 인덱스가 어떻게 쿼리에 영향을 미치는지 살펴봅니다. 디스크 읽기 방식 컴퓨터는 전기적 장치와 기계적 장치로 구성됩니다. CPU나 메모리같은 전기적 장치의 성능은 빠르게 발전해왔지만 HDD 같은 기계적 장치의 성능은 상당히 제한적으로 발전했습니다. 최근 SSD같은 전기적 장치를 사용하지만 아직 데이터 저장 매체는 컴퓨터에서 가장 느린 부분입니다. 데이터베이스 서버 입장에서 디스크 I/O가 가장 큰 병목을 가져오고 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건입니다. 랜덤 I/O와 순차 I/O 랜덤 I/O는 하드 디스크 드라이브의 플래터(원판)을 돌려서 읽어야할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다..
🎨 문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 📘 풀이 이 문제는 정렬과 그리디로 풀 수 있습니다. 폭격 미사일을 s에 대해 오름차순, e에 대해 내림차순으로 정렬합니다. // int[][] targets = [[s, e]] Arrays.sort(targets, (int[] a, int[] b) -> { if (a[0] - b[0] == 0) return b[1] - a[1]; return a[0] - b[0]; }); 요격 미사일을 최소한으로 사용해야 하기 때문에 최대한 많은 폭격 미사일이 겹치는 지점을 찾아야 합니다. 폭격 미사일은 (s, e..