N+1 쿼리 문제

1 개요[ | ]

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

2 예시[ | ]

문제상황
$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번의 쿼리로 얻을 수 있다.

3 같이 보기[ | ]

4 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}