
READ 성능은 좋아지지만, 데이터 수정 (INSERT, UPDATE, DELETE) 시 추가 비용이 발생하기에 무분별한 Index 생성은 지양해야 함
Composite, 복합 Index 같은 경우는 아래 점들을 주의해야 함
인덱스 컬럼에 함수나 연산을 씌우면 인덱스를 타지 못함, DATE(created_at) = 같은 형태는 범위 조건으로 바꿔야 함
카디널리티가 낮은 컬럼(상태값, 성별 등)은 단독 인덱스 효과가 적음, 값이 고르게 흩어지는 컬럼을 앞에 둠
조회하는 컬럼까지 인덱스에 들어 있으면 테이블 접근 없이 인덱스만으로 응답 가능, 커버링 인덱스
실제로 인덱스를 타는지는 EXPLAIN ANALYZE로 확인, 안 쓰는 인덱스는 쓰기 비용만 늘리므로 주기적으로 정리
아래 예시 쿼리로는 100만건의 데이터가 있다 가정할 때, 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를 타지 않을때, 30초 정도 소요
SELECT *
FROM user
WHERE id like 'test%'
LIMIT 10000, 100;
# Index를 태울 때, 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;