Skip to content

N+1 Query Problem

N+1 Query Problem (N+1 쿼리 문제, N+1 SELECT 문제, N+1 문제)

  • 쿼리 1번으로 N건을 가져왔는데, 관련 컬럼을 얻기 위해 쿼리를 N번 추가 수행하는 문제
  • 쿼리결과 건수마다 참조 정보를 얻기 위해 건수만큼 반복해서 쿼리를 수행하게 되는 문제
  • DB쿼리 수행비용(횟수)이 크기 때문에, eager 로딩 등의 방법으로 해결하는 것이 권장됨

Example

문제 상황:

$books = query_rows("SELECT * FROM books");
foreach( $books as &$book ) {
    $book['author_name'] = query_one("SELECT name FROM authors WHERE id=?", $book['author_id']); 
}
  • book N건을 얻기 위한 쿼리 1회
  • author_name을 얻기 위한 쿼리 N회
  • 성능 측면에서 상당히 불리하지만, 로직을 이해하기 쉽다는 장점은 있다.
$books = query_rows("SELECT b.*, a.author_name
    FROM books b LEFT JOIN authors a ON b.author_id=a.id");
  • 위와 같이 JOIN을 활용하면 1번의 쿼리로 얻을 수 있다.

See also

  • SQL
  • eager 로딩
  • LEFT JOIN
  • 쿼리

Favorite site