강의

멘토링

커뮤니티

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

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

작성한 질문수

5천억건이 넘는 금융 데이터를 처리하는 토스 개발자에게 배우는 MySQL

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

9강 인덱스 설계 관련 문의

해결된 질문

작성

·

61

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 때문에 인덱스 순서를 조심해야 한다는 내용인 거 같은데...

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

답변 3

1

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

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

 

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

 

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

 

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

 

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

 

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

0

실행계획 동일하게 나오지 않아요? where 절의 순서를 바꿔도 동일 하게 나올 듯 합니다.

앞의 두 컬럼을 조건으로 주면 둘 모두 access 조건 이기 때문에 결과값은 동일합니다.

예제가 좀 이상한거 같습니다. user_id가 없다거나 status가 아예 중간에 빠진 조건이면 문제가 될 것 같지만 문제될 만한 예제는 아닌 것 같습니다. 참고부탁드립니다. https://stackoverflow.com/questions/7311040/does-the-column-order-in-the-where-clause-matter-for-index-selection?utm_source=chatgpt.com

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

말해주신 부분이 맞습니다. 제가 좀 단편적으로 설명을 드린 부분이 있는거 같네요. 물론 사용하시는데에는 문제는 없지만, 휴먼 에러를 줄이기 위해서 이런 규칙을 지켜가면서 작성하시는게 유지보수 측면에서 더 도움이 되실꺼같아요.

 

하지만 양현수님이 질문주셨던 부분도 틀린 부분은 없고, 앞서 말씀드렸던 것처럼 추가적인 WHERE 조건문을 정렬하고 실행하는 작업을 줄일 수 있다는 부분도 고려하시면 좋을꺼같습니다!!

  • 근데 사실 되게 유의미한 성능적인 수치는 얻기는 힘들겁니다. 그래서 유지보수 하는 관점에서 지켜주시면 좋지 않을까싶어요.

 

감사합니다!

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. 인덱스 사용 전략:

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

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

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

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

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

작성한 질문수

질문하기