강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

김보수님의 프로필 이미지
김보수

작성한 질문수

김영한의 실전 데이터베이스 - 기본편

커버링 인덱스

### **: 복합 인덱스 순서 변경에 따른 쿼리 성능 차이가 없는 이유 분석**

작성

·

106

0

안녕하세요!
MySQL에서 복합 인덱스의 순서 변경이 쿼리 성능에 실질적으로 영향을 미치는지 테스트해 보고 있는데, 예상과는 다른 결과가 나와 도움을 요청드립니다.


테이블 구조

데이터가 저장된 테이블은 다음과 같습니다:(예시)

CREATE TABLE orders (
    group_id    VARCHAR(10),  -- 그룹 ID
    order_id    VARCHAR(20),  -- 주문 ID
    condition_id VARCHAR(20), -- 조건 ID
    contract_type VARCHAR(10), -- 계약 유형
    status_code VARCHAR(10), -- 상태 코드
    include_exclude_code VARCHAR(10)  -- 포함/제외 코드
);

데이터 분포는 다음과 같습니다:

  • group_id는 카디널리티가 낮음 (예: 값 종류가 'A', 'B' 등 소수 종류만 있음).

  • order_idcondition_id는 각각 고유값(유니크하거나 높은 카디널리티)을 가집니다.


실험한 쿼리

복합 인덱스를 2개 생성한 후 아래의 쿼리를 실행했습니다:

EXPLAIN ANALYZE
SELECT 
    order_id, include_exclude_code, group_id, contract_type, condition_id, 
    null AS additional_condition, status_code
FROM orders
FORCE INDEX(ix_orders_01) -- 또는 ix_orders_02
WHERE condition_id = 'C100000001'
  AND group_id = 'A'
  AND order_id IN (
    'O20201016020421', 'O20250808368450', 'O20250808368492',
    'O20250711342532', 'O20250711342535', 'O20240412709178'
  );

생성한 인덱스

  1. 인덱스 1: 데이터를 (group_id, order_id, condition_id) 순으로 정렬

CREATE INDEX ix_orders_01 ON orders (group_id, order_id, condition_id);
  1. 인덱스 2: 데이터를 (condition_id, order_id, group_id) 순으로 정렬

CREATE INDEX ix_orders_02 ON orders (condition_id, order_id, group_id);

실행 결과

두 인덱스를 강제로 사용해서 실행한 결과, 실행 비용(cost), 실제 실행 시간(actual time), 그리고 사용된 인덱스 조건에서 모두 차이를 보이지 않았습니다.

실행 계획 결과 (인덱스 1과 2 공통):

  • 인덱스 조건: (condition_id = 'C100000001' AND order_id IN (...) AND group_id = 'A')

  • 실행 비용(cost):15.41 rows=22

  • 실제 실행 시간(actual time):0.054~0.058초


질문

  1. 두 인덱스가 서로 다른 순서로 설정되었는데, 실행 결과가 동일한 이유가 무엇인가요?

  2. 이런 경우 복합 인덱스의 순서가 실제 성능에 영향을 주지 않는다고 판단해도 될까요?

  3. 추가로 고려해야 할 사항이 있다면 조언 부탁드립니다!

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
김보수님이 질문하신 내용에 대해 설명 드리겠습니다.

  1. 두 인덱스가 서로 다른 순서로 설정되었는데, 실행 결과가 동일한 이유가 무엇인가요?

두 인덱스의 순서가 서로 다르지만, 쿼리에서 사용한 조건이 인덱스의 모든 컬럼을 포함하고 있고, 비교 조건이 모두 = (equal-to) 조건이어서 옵티마이저가 인덱스 순서에 상관없이 동일한 쿼리 계획을 생성할 수 있습니다. MySQL에서는 인덱스의 첫 번째 컬럼이 정렬이나 필터링에서 중요한 역할을 하지만, 모든 조건이 = 일 때는 그 순서가 덜 중요해집니다.

  1. 이런 경우 복합 인덱스의 순서가 실제 성능에 영향을 주지 않는다고 판단해도 될까요?

조건부에 따라 다릅니다. 현 쿼리의 경우는 특별히 성능 차이가 없었지만, 이것이 언제나 그런 것은 아닙니다. 예를 들어, ORDER BY가 있거나 range 타입의 조건이 함께 있다면 인덱스 컬럼의 순서가 성능에 영향을 미칠 수 있습니다. 일반적으로 테이블의 구조나 사용 사례에 따른 튜닝이 필요하며, 광범위한 케이스를 통해 조건을 테스트하는 것이 중요합니다.

  1. 추가로 고려해야 할 사항이 있다면 조언 부탁드립니다!

    • 데이터 분포 및 쿼리 패턴 분석: 데이터의 분포와 쿼리 패턴을 철저히 분석하여 주로 어떤 조건이 많이 사용되는지 확인하고 인덱스를 설계합니다.
    • 쿼리 다양성: 다양한 쿼리에서 인덱스를 시험해 보고 모든 경우에 성능이 일정한지 체크하는 것이 필요합니다.
    • 서로 다른 수준의 조건: =, BETWEEN, IN, 및 LIKE등 쿼리 조건에 따라 인덱스의 효율성이 다르게 나타날 수 있으므로 이런 부분도 함께 비교 테스트하는 것이 좋습니다.
    • 실행 계획 확인: EXPLAIN 명령어를 통해 실행 계획을 분석하는 버릇을 들이고, 인덱스가 실제 쿼리를 어떻게 개선하는지도 확인해야 합니다.

추가로 정보가 필요하시거나 다른 궁금한 점이 있으시면 언제든지 문의해주세요!

출처: MySQL 인덱스 관련 설명

김보수님의 프로필 이미지
김보수

작성한 질문수

질문하기