Inflearn brand logo image

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

민섭님의 프로필 이미지
민섭

작성한 질문수

5천억건이 넘는 금융 데이터를 처리하는 토스 개발자에게 배우는 MySQL [ By. 비전공자 & Toss 개발자 ]

테이블 분산을 위한 파티셔닝 전략과 인덱스 최적화 설계 기법

9강 인덱스 설계 관련 문의

해결된 질문

작성

·

22

1

인덱스가 아래와 같을때

idx_orders_user_status(user_id, status, created_at)

아래 쿼리문이 왜 문제인지 궁금합니다.

select *
from orders
where 1=1
    and status = 'pending'
    and user_id = 123

강의 내용(11분 30초)에서는 인덱스의 컬럼 순서와 조건문(where)의 컬럼 순서가 틀려 효율적이지 못하다고 설명해 주시는 거 같습니다.

하지만 이는 옵티마이저에 의해 where절의 컬럼 순서를 재계획 하는 걸로 알 고 있습니다.

강의의 의도는 left prefix index rule 때문에 인덱스 순서를 조심해야 한다는 내용인 거 같은데...

혹시 꼭 순서를 지켜야 하는 이유가 있을까요??
(첫 번째 인덱스 미사용, 중간 컬럼 미사용, 커버링 인덱스 등의 특정 상황 제외)

답변 2

1

Hong님의 프로필 이미지
Hong
지식공유자

안녕하세요 민섭님 질문 주셔서 감사합니다.

 

말씀해 주신 부분처럼, 옵티마이저가 쿼리 컬럼의 순서를 자체적으로 재졍렬 할 수 있습니다. 하지만 하지 않아도 되는 작업인데, 다시 재계획을 할 필요가 있는지 고민해 보시면 좋을꺼같아요.

 

예를들어서 그냥 "A"라는 길로 가면 되는데, 굳이 "B -> A" 이렇게 돌아서 갈 이유가 있을까요?? "B" 라는 길로 가다가 "어 길이 잘못되었네?? 수정해야지" 해서 "A"로 간다면, 그냥 "A"로 가는것보다 더 비효율적일겁니다.

 

똑같은 원리로 그냥 처음에 명확하게 길을 알려준다면, 옵티마이저는 추가적인 작업을 할 필요가 없을꺼에요. 그냥 옵티마이저도 인정하고 우리도 인정 할 수 있는 길이 될거니깐요.

 

이런 개념으로 이해하시면 됩니다. 무언가 자동으로 처리해주는 것은 그만큼 비효율을 낳을수가 있습니다. 이 부분을 이해하시면 프로그래밍을 하는데에 있어서 도움이 되실 꺼 같아요.

 

질문 주셔서 감사합니다 :)

0

안녕하세요, 인프런 AI 인턴입니다. 민섭님.

MySQL에서의 인덱스 설계는 성능 최적화의 핵심입니다. 질문해주신 내용은 인덱스의 컬럼 순서가 쿼리의 성능에 어떠한 영향을 미치는지에 대한 것인데요. 이는 MySQL의 인덱싱 방식과 관련이 깊습니다.

쿼리 성능과 인덱스의 순서

MySQL에서는 인덱스의 순서가 쿼리 성능에 영향을 줄 수 있습니다. MySQL 옵티마이저는 인덱스를 사용할 때 왼쪽부터 오른쪽으로 인덱스를 스캔합니다. 따라서, 인덱스 컬럼의 순서는 중요합니다. 특히, 결합 인덱스(composite index)에서는 Leftmost Prefix Rule(왼쪽 접두사 규칙)이 적용됩니다.

  • Leftmost Prefix Rule: 결합 인덱스를 이용할 때, 인덱스의 왼쪽부터 시작해 연속된 컬럼만 인덱스 사용이 가능합니다. 중간의 컬럼이 빠지면 그 이후의 컬럼은 사용할 수 없습니다.

인덱스와 쿼리의 관계

  1. 인덱스 및 쿼리:

    • 인덱스: (user_id, status, created_at)
    • 쿼리에서는 status가 먼저 사용되고 그 뒤에 user_id 조건이 오고 있습니다.
  2. 쿼리 성능의 문제:

    • 옵티마이저가 where절의 순서를 재계획할 수 있지만, 항상 최적의 계획을 보장하지 않으며, 데이터 양이나 조건에 따라 비효율적일 수 있습니다.
    • 위와 같은 쿼리에서 MySQL은 user_id를 첫 번째로 사용하지 않기 때문에 인덱스의 장점을 최대한 활용하지 못할 가능성이 있습니다. 즉, user_id을 기준으로 인덱스를 사용하는 것이 아니라 status로 필터링을 먼저 하게 됩니다.
  3. 인덱스 사용 전략:

    • 인덱스 순서와 사용 전략을 맞추어 쿼리 성능을 향상시켜야 합니다.
    • 인덱스 작성 시 실제 사용될 쿼리에 맞춰 가장 자주 필터링이 되는 조건부터 순서를 잡는 것이 유리할 수 있습니다.

좀 더 구체적인 예시와 자세한 설명을 원하시면 아래 기존 답변을 참조하시면 도움이 됩니다.

위 답변에서는 인덱스 설계와 쿼리 성능에 대한 실질적인 조언이 포함되어 있습니다. 강의의 내용을 바탕으로 쿼리와 인덱스를 어떻게 최적화할지 고민해 보시기 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

민섭님의 프로필 이미지
민섭

작성한 질문수

질문하기