- 색인, 데이터를 빠르게 찾기 위한 장치, 책의 마지막 장쯤에 있는 찾아보기 같은 개념
- Index는 보통 B-트리로 이루어져 있다, 루트, 리프, 루트와 리프 사이에 있는 브랜치 노드로 나뉜다
- 트리 탐색이 루트 노드부터 일어나는데, 위 캡쳐 같은 경우엔 특정 숫자를 기반으로 분류하여 브랜치 노드를 거치고, 리프 노드까지 도달하여 탐색하는 것을 알 수 있다
- Index는 기본적으로 테이블의 PK를 기반으로 하나가 생성이 되며, 필요할 경우 Unique 또는 CREATE INDEX 명령어로 보조 Index를 생성할 수도 있다
- 보통 서비스 기능 구현시 필요에 따라 Index 최적화가 필요한데, 대략 아래와 같다
- 읽기 비용이 많이 든다, 데이터가 수정이 되었다면 Index도 수정이 될수 있어 무작정 Index를 설정하는 것은 효율적이지 않은 것
- 테스팅이 필요하다, 서비스마다 테이블 구조와 쿼리가 다르기 때문에 EXPLAIN 같은 명령어로 쿼리 시간을 확인하는 것이 중요하다
- 복합 Index는 순서가 중요하다
- 어떤 필드를 equal, == 같은 조건이 있으면 제일 먼저 Index로 세팅한다
- 정렬 필드가 있다면 그 다음 Index로 세팅한다
- 다중 출력 필드, <, > 같은 쿼리가 있다면 나중 Index로 세팅한다
- 유니크한 필드가 있다면 우선권을 둔다, 예를 들어 사람 테이블의 컬럼이 age, email이 있다 가정할 때 age보단 조금 더 유니크한 email 필드를 Index로 세팅해야 한단 뜻
- 아래는 MySQL에서 간단하게 Index를 확인할 수 있는 쿼리이다
CREATE TABLE user (
number INT NOT NULL AUTO_INCREMENT,
id VARCHAR(20) NOT NULL,
nickname VARCHAR(30) NOT NULL,
PRIMARY KEY (number),
KEY idKey (id)
);
# Index를 타지 않을때, 100만건의 데이터가 있다고 하면 30초 정도 소요
SELECT *
FROM user
WHERE id like 'test%'
LIMIT 10000, 100;
# Index를 태울 때, 100만건의 데이터가 있다고 하면 0.5초 정도 소요
SELECT r.*
FROM (
SELECT number
FROM user
WHERE id like 'test%'
LIMIT 10000, 100
) u JOIN user r ON u.number = r.number;