728x90
개요
공식 문서를 읽어보며 내용을 정리해 보자
- MySQL 최적화 및 인덱스 공식 문서
https://dev.mysql.com/doc/refman/8.4/en/optimization-indexes.html
1. 최적화 및 인덱스
인덱스 생성의 장점
- 인덱스는 테이블 행으로 가는 포인터 역할을 하여,
WHERE
절 조건에 맞는 행을 빠르게 찾고 다른 열 값을 조회할 수 있도록 돕는다. - MySQL의 모든 자료형에 인덱스를 생성할 수 있다.
- 과도한 인덱스 생성은
- 저장 공간 낭비
- 옵티마이저가 사용할 인덱스를 결정하는 시간 증가
INSERT
/UPDATE
/DELETE
시 인덱스 유지 비용 증가
- 적절한 균형으로 최적의 인덱스 집합을 찾는 것이 중요하다.
- 인덱스는 테이블 행으로 가는 포인터 역할을 하여,
인덱스가 없을 때
- MySQL이 전체 테이블을 스캔하며 조건에 맞는 행을 찾아야 하므로, 테이블이 클수록 성능 저하가 심해진다.
인덱스가 있을 때
- MySQL은 B-Tree(대부분의 인덱스)나 R-Tree(공간 데이터) 등에서 중간 위치를 바로 찾아가므로
전체 행을 순차적으로 읽는 것보다 훨씬 빠르다.
- MySQL은 B-Tree(대부분의 인덱스)나 R-Tree(공간 데이터) 등에서 중간 위치를 바로 찾아가므로
인덱스 저장 구조
- PRIMARY KEY, UNIQUE, INDEX, FULLTEXT 등은 B-Tree에 저장된다.
- 예외
- 공간 데이터 인덱스: R-Tree
- MEMORY 테이블의 해시 인덱스: Hash Index
- InnoDB의 FULLTEXT: 역순 목록
2. 인덱스 사용 시기 및 방법
WHERE 절 필터링
- 조건에 맞는 행을 빠르게 찾기 위해 사용.
선택적 인덱스 제거
- 여러 인덱스 중 가장 선택도가 높은(가장 적은 행을 걸러내는) 인덱스를 MySQL이 선택한다.
다중 열 인덱스
(col1, col2, col3)
인덱스는(col1)
(col1, col2)
(col1, col2, col3)
에 대해 사용할 수 있다.
(왼쪽 접두사 원칙)
조인 최적화
- 조인할 때 양쪽 테이블의 조인 키가 같은 자료형·길이·문자셋이어야 인덱스를 효과적으로 사용한다.
- 예:
VARCHAR(10)
vsCHAR(10)
는 가능,VARCHAR(10)
vsCHAR(15)
는 불가능.
MIN()/MAX() 최적화
WHERE key_part1 = 10
과 같은 상수 조건이 있으면INDEX(key_part1, key_part2)
에서MIN(key_part2)
,MAX(key_part2)
를
단일 인덱스 조회로 처리할 수 있다.
ORDER BY / GROUP BY
- 인덱스가
(k1, k2)
일 때ORDER BY k1, k2
또는ORDER BY k1 DESC, k2 DESC
에만 적용된다.
- 인덱스가
커버링 인덱스
- 쿼리에 사용된 모든 열이 인덱스에 포함되면, 데이터 행을 읽지 않고 인덱스만으로 결과를 반환할 수 있다.
- 예:
에서SELECT key_part3 FROM tbl_name WHERE key_part1 = 1;
(key_part1, key_part3)
인덱스는 커버링 인덱스가 된다.
728x90
'DB' 카테고리의 다른 글
[MySQL] Query 성능 향상 _ 1(JOIN 및 SUM, COUNT) (0) | 2024.12.16 |
---|---|
[MySQL] 복합 인덱스(Multiple-Column Indexes) (0) | 2024.12.12 |
[MySQL] Index 정리 (0) | 2024.12.12 |
[MySql] 성능 개선에 관하여_해결 해 보자_2_경험 (0) | 2024.08.22 |
[MySql] 성능 개선에 관하여_해결 해 보자_1_explain (0) | 2024.08.06 |