설계 면접 문제 12 · 4부 많아지면

검색 필터 인덱스 설계 면접 질문: 카테고리·브랜드·가격 조건과 초당 3만 요청

시스템 디자인 Vol.1 · 12장 「조건으로 거르는 검색」에서

이런 화면입니다

쇼핑몰에서 운동화를 찾습니다. 카테고리는 스니커즈, 브랜드는 하나 고르고, 가격은 10만 원 이하. 필터를 고를 때마다 목록이 즉시 좁혀집니다.

상품은 100만 건이고, 사람들은 대부분 첫 페이지만 봅니다. 그 첫 페이지에 초당 3만 번의 요청이 몰립니다.

면접관이 이렇게 묻습니다

면접관

상품 100만 건에서 카테고리, 브랜드, 가격대 조건으로 검색합니다. 인덱스를 어디에 어떻게 걸지 설계해 보세요. 첫 페이지에는 초당 3만 요청이 옵니다. 쿼리가 이미 인덱스를 탄다면, 무엇을 더 하시겠어요?

범위부터 좁힙니다

조건의 성질부터 가릅니다. 카테고리와 브랜드는 정확히 일치하는 조건이고, 가격은 범위 조건입니다. 상품명 키워드 검색은 결이 달라서 접어 둡니다.

부하의 모양도 같이 봅니다. 첫 페이지에 몰리고 뒤로 갈수록 줄어듭니다. 누가 보든 같은 조건이면 같은 목록이 나옵니다.

이 문제의 무게

세 조건을 인덱스가 어떻게 받아 낼지가 첫째 질문이고, 같은 답을 초당 3만 번 만드는 일을 어떻게 줄일지가 둘째 질문입니다.

가장 많이 나오는 답

인덱스 없이 시작하거나, 조건 컬럼마다 인덱스를 하나씩 겁니다. 그래도 느리면 첫 페이지 응답을 통째로 30초 동안 담아 둡니다.

CREATE INDEX idx_category ON products (category_id);
CREATE INDEX idx_brand    ON products (brand_id);
CREATE INDEX idx_price    ON products (price);

실행 계획을 보면 인덱스를 탔다고 나옵니다.

그런데 여기서 깨집니다

카테고리 인덱스로 8만 건을 추린 뒤, 나머지 조건은 그 8만 행을 하나하나 읽으며 거릅니다. 인덱스를 탔다는 말과 빠르다는 말은 다른 이야기입니다.

응답을 통째로 담아 두면 새 상품이 30초 동안 안 보이고, 만료되는 순간 3만 요청이 한꺼번에 데이터베이스로 쏟아집니다. 병목은 데이터베이스인데 서버 대수를 늘리는 답도 자주 나옵니다.

떨어지는 답은 이런 모양입니다

  • 조건마다 인덱스를 하나씩 겁니다.
  • 인덱스를 걸고 나서 정말 쓰이는지 확인하지 않습니다.
  • 느리면 인덱스를 더 걸겠다는 답만 반복합니다.
  • 응답을 통째로 담고 만료 시간 숫자만 말하고, 만료 순간에 무슨 일이 생기는지는 답하지 못합니다.

면접관은 여기서 멈추지 않습니다

  1. 브랜드를 안 고르고 카테고리와 가격만 거는 사용자가 많으면요?

    인덱스가 받아 내는 조건 조합을 실제 사용 패턴과 맞춰 보는지 봅니다.

  2. 「에어 포스 흰색」 같은 키워드 검색까지 하려면요?

    같은 데이터베이스로 계속 갈지 판단하는 기준을 아는지 봅니다.

  3. 서버 안 메모리에 담으면 안 되나요?

    서버가 여러 대일 때 생기는 일을 따지는지 봅니다.

  4. 팔로우한 사람들의 글만 모은 피드라면요?

    누가 보든 같은 목록이라는 전제가 깨질 때를 봅니다.

VOL.1 · 12장

이 다음 판단은 책에서 이어집니다

책은 세 조건을 받아 낼 인덱스를 어떻게 걸지 정하고, 인덱스가 정말 일하는지 눈으로 확인하는 방법, 인덱스를 탔는데도 느린 이유, 검색 결과 개수는 누가 세는지까지 풉니다. 초당 3만 번 열리는 목록에서 새로 생기는 문제는 이어지는 4부 심화에서 다룹니다.

12장에서 이어지는 것

  • 세 조건을 받아 내는 인덱스의 모양
  • 인덱스가 일하는지 눈으로 확인하는 방법
  • 인덱스는 탔는데 왜 아직 느린가
  • 검색 결과 개수는 누가 세나
  • 걸지 말아야 할 인덱스
시스템 디자인 Vol.1 보러 가기 →

매일 쓰는 화면에서 나온 설계 문제 22개 · 263쪽 · 현직 엔지니어와 30분 모의면접

22문제 전체 보기