728x90
개요
정리하기에 앞서, MySQL 공식 문서와 ChatGPT 검색 결과를 기반으로 테스트를 진행할 예정입니다.
아래 링크와 정리 내용을 참고하여 인덱스(Index) 설정에 대해 실험합니다.
MySQL 공식 문서
ChatGPT 정리
MySQL에서 복합 인덱스를 설정할 때는, 쿼리의 실행 계획과 컬럼 사용 순서에 따라 인덱스 컬럼 순서를 결정해야 합니다.
특히 SELECT
·JOIN
·WHERE
·GROUP BY
·HAVING
절에 사용된 컬럼을 기준으로, 다음 우선순위에 따라 인덱스를 설계합니다.
1. WHERE 조건 (최우선)
WHERE
절은 가장 먼저 실행되며, 데이터 범위를 좁히는 역할을 합니다.- 선택도가 높은(중복이 적은) 컬럼을 앞에 배치하면 효율이 높아집니다.
SELECT ...
FROM table
WHERE column1 = 'value1'
AND column2 > 10;
→ 인덱스 순서: (column1
, column2
)
2. JOIN 조건
JOIN … ON
절에 사용되는 컬럼은 조인 성능에 직접 영향을 줍니다.WHERE
절 다음으로 고려합니다.
SELECT ...
FROM table1 t1
JOIN table2 t2
ON t1.colA = t2.colB
WHERE t1.colC = 'value';
→
- table1 인덱스: (
colC
,colA
) - table2 인덱스: (
colB
)
3. GROUP BY
- 집계 후 그룹핑에 사용되는 컬럼도 인덱스에 포함하면 효율적입니다.
WHERE
·JOIN
조건 뒤에 추가합니다.
SELECT col1, col2, SUM(col3)
FROM table
WHERE col4 = 'value'
GROUP BY col1, col2;
→ 인덱스 순서: (col4
, col1
, col2
)
4. SELECT (Covering Index)
SELECT
절의 컬럼이 이미 인덱스에 포함되어 있으면 디스크 I/O를 줄일 수 있습니다.- Covering Index를 만들면 쿼리 처리 속도가 더 빨라집니다.
SELECT col1, col2
FROM table
WHERE col3 = 'value'
GROUP BY col4;
→ 인덱스 순서: (col3
, col4
)
(col1
, col2
는 커버링 인덱스에 포함되어 있음)
5. HAVING 조건 (최후순위)
HAVING
절은GROUP BY
이후 적용되므로, 인덱스 영향이 가장 적습니다.WHERE
절로 필터링할 수 없는 조건에만 사용합니다.
SELECT col1, SUM(col2)
FROM table
GROUP BY col1
HAVING SUM(col2) > 100;
→ 인덱스 순서: (col1
)
종합 우선순위
- WHERE: 가장 중요한 필터링
- JOIN: 테이블 연결 기준
- GROUP BY: 집계 및 그룹핑
- SELECT: 커버링 인덱스 활용
- HAVING: 최후순위
추가 팁
- EXPLAIN 활용: 생성한 인덱스가 실제로 사용되는지 확인하세요.
- Query Rewrite:
HAVING
을WHERE
로 이동해 필터링 성능을 개선합니다. - 인덱스 크기 관리: 너무 많은 컬럼을 인덱스에 포함하면 성능 저하와 저장 공간 낭비가 발생할 수 있습니다. 가장 중요한 컬럼만 포함하세요.
728x90
'DB' 카테고리의 다른 글
[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 |
[MySql] 성능 개선에 관하여_고찰 (0) | 2024.08.06 |