DB

[MySQL] Index 정리

Raconer 2024. 12. 12. 00:23
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)


종합 우선순위

  1. WHERE: 가장 중요한 필터링
  2. JOIN: 테이블 연결 기준
  3. GROUP BY: 집계 및 그룹핑
  4. SELECT: 커버링 인덱스 활용
  5. HAVING: 최후순위

추가 팁

  1. EXPLAIN 활용: 생성한 인덱스가 실제로 사용되는지 확인하세요.
  2. Query Rewrite: HAVINGWHERE로 이동해 필터링 성능을 개선합니다.
  3. 인덱스 크기 관리: 너무 많은 컬럼을 인덱스에 포함하면 성능 저하와 저장 공간 낭비가 발생할 수 있습니다. 가장 중요한 컬럼만 포함하세요.
728x90