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

ned.choi님의 프로필 이미지

작성한 질문수

Real MySQL 시즌 1 - Part 2

Ep.15 풀스캔 쿼리 패턴 및 튜닝

안녕하세요. 인덱스 관련 질문 있습니다.

해결된 질문

24.07.24 17:54 작성

·

202

0

에피소드 15에서 복합 인덱스의 경우 순서가 중요하다고 하셨는데요.

그럼 인덱스 생성 시 (account_type, joined_at) 와 같은 순서일때 조건에 joined_at account_type 순서로 주어지면 인덱스를 활용하지 못하는게 맞을까요??

답변 2

0

백은빈님의 프로필 이미지
백은빈
지식공유자

2024. 08. 20. 22:39

안녕하세요. 답변이 늦었습니다.

인덱스가 (account_type, joined_at)과 같이 존재할 때, 쿼리 WHERE 절에는 (joined_at, account_type) 순서로 조건이 주어졌다고해서 인덱스를 활용하지 못하는 것은 아닙니다.

인덱스를 구성하는 컬럼들이 모두 조건으로 주어져있기 때문에 인덱스는 당연히 사용이 가능합니다.

쿼리 WHERE 절에 나열된 순서가 인덱스 내 컬럼 순서와 다르더라도 MySQL 옵티마이저는 인덱스를 사용할 수 있는 조건들을 추려내서 인덱스를 활용하는 최적화를 수행하기 때문에, 순서는 크게 중요하지 않고 인덱스를 구성하고 있는 컬럼들이 조건으로 주어져 있는지가 더 중요하다고 봐주시면 좋을 것 같아요.

그리고 추가적으로 쿼리에서 컬럼들에 주어진 조건 형태에 따라 인덱스 내 컬럼 순서가 쿼리 처리 효율에 영향을 줄 수 있는데요.

예를 들어, 아래와 같이 쿼리에서 인덱스를 구성하는 컬럼들 모두 동등 조건으로 조건값이 주어진 경우에는 인덱스 내의 컬럼 순서는 어떤 순서든 크게 상관이 없습니다.

SELECT * 
FROM tab1 
WHERE account_type = ? 
AND joined_at = ?

그러나 아래와 같이 joined_at이 동등 조건이 아닌 범위 조건으로 사용된 경우에는, 인덱스 내 컬럼 순서가 (account_type, joined_at) 인 것이 좋습니다.

SELECT * 
FROM tab1 
WHERE account_type = ? 
AND joined_at >= ? AND joined_at < ?

(account_type, joined_at) 으로 인덱스가 구성돼있는 경우, 쿼리 처리 시 인덱스에서 실제 조건에 만족하는 인덱스 데이터들만 스캔하지만, (joined_at, account_type) 순서로 인덱스가 구성돼있는 경우 인덱스 선두에 위치한 joined_at 조건 범위에 속한 인덱스 데이터를 모두 스캔하게 되기 때문입니다.

관련해서 모든 내용을 댓글로 다 설명드리기는 어려워서.. 혹시 Real MySQL 8.0 책 1권을 가지고 계시다면, "8.3.7.1 비교 조건의 종류와 효율성" 부분을 읽어보시는 것을 추천드립니다.

추가로 궁금한 부분 있으시면 다시 말씀해주세요.

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 07. 26. 17:56

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

ned.choi님, 복합 인덱스에서 순서는 매우 중요합니다. 기본적으로 (account_type, joined_at) 순서로 인덱스를 생성했다면, WHERE 절의 조건도 이와 동일한 순서로 제시되어야 인덱스를 효율적으로 활용할 수 있습니다.

즉, 조건에 joined_at, account_type 순서로 주어진다면, 설계된 복합 인덱스의 효율을 온전히 활용하지 못할 수 있습니다. 인덱스는 왼쪽부터 오른쪽으로 순서대로 사용되기 때문에, 첫 번째 컬럼이 조건에 포함되지 않으면 이후 컬럼의 인덱스도 활용하지 못하는 경우가 발생합니다.

단, 일부 데이터베이스 시스템에서는 쿼리 최적화를 통해 컬럼의 순서와 관계없이 인덱스를 활용할 수 있게 하는 경우도 있지만, 이는 보장된 동작이 아니므로 인덱스 설계 시 주의해야 합니다.

ned.choi님의 프로필 이미지

작성한 질문수

질문하기