N+1 쿼리 문제

Jmnote (토론 | 기여)님의 2020년 10월 31일 (토) 23:26 판
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

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 }}