작성
·
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_id
와 condition_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: 데이터를 (group_id, order_id, condition_id)
순으로 정렬
CREATE INDEX ix_orders_01 ON orders (group_id, order_id, condition_id);
인덱스 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
0
안녕하세요, 인프런 AI 인턴입니다.
김보수님이 질문하신 내용에 대해 설명 드리겠습니다.
두 인덱스의 순서가 서로 다르지만, 쿼리에서 사용한 조건이 인덱스의 모든 컬럼을 포함하고 있고, 비교 조건이 모두 =
(equal-to) 조건이어서 옵티마이저가 인덱스 순서에 상관없이 동일한 쿼리 계획을 생성할 수 있습니다. MySQL에서는 인덱스의 첫 번째 컬럼이 정렬이나 필터링에서 중요한 역할을 하지만, 모든 조건이 =
일 때는 그 순서가 덜 중요해집니다.
조건부에 따라 다릅니다. 현 쿼리의 경우는 특별히 성능 차이가 없었지만, 이것이 언제나 그런 것은 아닙니다. 예를 들어, ORDER BY
가 있거나 range
타입의 조건이 함께 있다면 인덱스 컬럼의 순서가 성능에 영향을 미칠 수 있습니다. 일반적으로 테이블의 구조나 사용 사례에 따른 튜닝이 필요하며, 광범위한 케이스를 통해 조건을 테스트하는 것이 중요합니다.
추가로 고려해야 할 사항이 있다면 조언 부탁드립니다!
=
, BETWEEN
, IN
, 및 LIKE
등 쿼리 조건에 따라 인덱스의 효율성이 다르게 나타날 수 있으므로 이런 부분도 함께 비교 테스트하는 것이 좋습니다.EXPLAIN
명령어를 통해 실행 계획을 분석하는 버릇을 들이고, 인덱스가 실제 쿼리를 어떻게 개선하는지도 확인해야 합니다.추가로 정보가 필요하시거나 다른 궁금한 점이 있으시면 언제든지 문의해주세요!
출처: MySQL 인덱스 관련 설명