지난 시간에는 단일 인덱스에 대해서 알아보았습니다 이번에는 복합 인덱스 복합 인덱스는 둘 이상의 컬럼을 결합해서 만드는 것을 말합니다 예를 들어서 다음과 같은 인덱스와 쿼리가 있다고 가정을 하겠습니다 그리고 그 데이터를 바탕으로 특정 데이터를 찾아가는 방법을 보겠습니다
1
2
3
4
5
6
7
create index custom_N1 on custom(sex , customName)
SELECT * FROM custom
where sex = '남'
and customName = '정수민'
이런 인덱스와 쿼리가 있을 때 B-Tree를 먼저 보겠습니다
Root는 남 & 최 가 root 블록에 있고 아래 Branch 블록 왼쪽에는 인덱스보다 작거나 같은 즉 (남 & 최) 보다 작거나 같은 인덱스 데이터들의 모임이고 오른쪽은 남 & 최 보다 크거나 같은 인덱스들이 모여 있습니다 그럼 이들의 리프 블록을 보겠습니다
리프 블록은 이것이고 우리가 여기서 기준으로 삼을 데이터는 남 & 이재룡 데이터입니다 이 데이터를 기준으로 2개를 만들어보겠습니다 다만 제가 위에서부터 계속 오른쪽 왼쪽 이렇게만 나눠서 Branch에 매핑되는 Leaf는 단 두 개 밖에 없다고 오해하실 수 있는데 실제로는 그렇지 않습니다 데이터가 많아지면 많아질수록 Leaf의 개수는 늘어나지만 이해를 위해서 단적인 예만 들고 있는 것입니다
왼쪽 Leaf
왼쪽 Leaf는 남 & 박종호 보다 크거나 같지만 남 & 이재룡보다는 작거나 같은 (데이터가 많아지만 미만에서 이하로 변경됨) 데이터가 존재합니다
오른쪽 Leaf
오른쪽 Leaf는 남 & 이재룡보다 크거나 같지만 남 & 정재우 보다 작거나 같은 (데이터가 많아지만 미만에서 이하로 변경됨) 데이터가 존재합니다
데이터 찾기
그럼 전체적으로 데이터를 어떻게 찾는지 보겠습니다 Root 블록으로 다시 올라와서 우리가 찾을 데이터는 성별이 남 이면서 이름이 정수민인 사람을 찾는 것입니다 root 기준으로 남 & 정수민은 왼쪽에 존재합니다 그러면 첫 번째 LMC 블록으로 내려가게 됩니다 그때 마주하는 데이터는 남 & 강우혁 넘어갑니다 남 & 박종호 넘어갑니다 남 & 이재룡 이때 다음 데이터를 보게 됩니다 남 & 정재우가 보입니다 그럼 옵티마이저는 이곳에 데이터가 있다고 생각을 합니다 왜냐하면 정수민이라는 데이터는 이재룡 < 정수민 < 정재우 이 순서이기 때문에 먼저 남 & 이재룡 데이터를 살펴봅니다 왼쪽 오른쪽 선택할 대 이때는 당연히 오른쪽을 선택하게 됩니다 왼쪽 데이터는 이재룡 미만(이하) 인 데이터들이 존재하기 때문에 살펴보지 않고 오른쪽 Leaf를 살펴봅니다 이때 하나씩 스캔하면서 정수민을 찾습니다 내려가서 남 & 정수민을 찾으면 바로 스캔을 멈추지 않고 다음 레코드를 한 번 더 살펴봅니다 같은 동명이인이 존재할 수 있기 때문이죠 하지만 다음 데이터가 남 & 정영호이기 때문에 스캔을 멈추고 결과를 도출합니다 글로 서술하면 어렵기에 순서로 나열하겠습니다
Root에서 정수민이 존재할 가능성이 있는 Brach 블록을 선택 왼쪽 브랜치는 남 & 최 작거나 같은 데이터들이 모여 있음으로 왼쪽을 선택
브랜치 블록에서 하나씩 스캔을 하면서 내려감 이때 남 & 이재룡을 스캔하고 다음 블록인 남 & 정재우 데이터를 보고 스캔을 멈춤 이 둘 사이에 있다고 확신하기 때문 (이재룡 < 정수민 < 정재우)
남 & 이재룡이 가리키는 Leaf 블록으로 내려가서 보게 되는데 이때 오른쪽을 선택 이유는 정수민은 (이재룡 < 정수민 < 정재우) 이기 때문에 왼쪽 leaf는 이재룡 보다 작거나 같은 데이터들이 모여 있기 때문에 선택하지 않음
오른쪽으로 내려와서 스캔을 진행 이때 남 & 정수민 데이터를 찾으면 곧바로 멈추지 않고 다음 레코드를 살펴봄 동명이인이 있을 수 있기 때문에 한번 살펴보고 있으면 계속해서 스캔을 해서 나아가지만 없으면 멈추고 데이터를 출력을 준비함
이렇게 인덱스를 이용해서 데이터를 찾게 됩니다