[RoadMap] N + 1 problem

Info Notice:
안녕하세요. HwanSeok입니다.
본 포스팅은 backend의 기초 개념을 다지는 포스팅입니다.

N+1 문제

이 문제는 쿼리 1번으로 N개의 row를 가져왔는데, 다시 관련된 컬럼을 얻기 위해서 N번 쿼리를 추가적으로 수행하는 문제를 말합니다. DB 쿼리 수행 비용이 크기 때문에 서비스 응답시간을 크게 느리게 만들 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
# 1번의 쿼리로 N개의 데이터를 조회
books = query(
  select * 
  from books
)
# N번의 쿼리로 각각의 관련 컬럼을 다시 조회
for book in book:
  book['author'] = query(
    select name 
    from author 
    where id = books.author_id
  )

위와 같은 문제는 join을 사용하면 한 번의 쿼리로 진행할 수 있습니다.

1
2
3
4
book = query(
  select b.*, a.author_name as author_name
  from books b LEFT JOIN authors a ON b.author_id = a.id
  )

또는 WHERE IN 쿼리를 통해 해결할 수 있습니다.

1
2
select * from books;
select * from authors where id in (1,2,3, ...);

Reference

  • https://www.infoq.com/articles/N-Plus-1/

Success Notice:
수고하셨습니다. :+1:

Leave a comment