1 개요[ | ]
- eager loading, preloading
- eager 로딩, 이거 로딩, 이른 로딩, 즉시 로딩, 사전 로딩, 선행 로딩, 조기 로딩, 프리로딩
- 로딩시 참조해야 하는 정보를 미리 명시하는 일
- 필요할 수 있는 모든 관련 데이터를 미리 한 번에 로드하는 기법
- 이를 통해 나중에 데이터를 사용할 때 추가적인 데이터베이스 쿼리를 피할 수 있다.
- 주로 ORM 프레임워크에서 사용되며, 이를 통해 성능을 향상시키고 N+1 문제를 방지할 수 있다.
- 대략 지연 로딩의 반대되는 개념이다.
2 예시[ | ]
2.1 라라벨[ | ]
N+1 쿼리 상황
PHP
Copy
foreach (Book::all() as $book)
{
echo $book->author->name;
}
- →
Book::all()
에는 author 정보가 없어서 Book 건수만큼 쿼리 추가 수행 (1+N회)
MySQL
Copy
SELECT * FROM books;
SELECT * FROM authors WHERE id=1;
SELECT * FROM authors WHERE id=2;
SELECT * FROM authors WHERE id=3;
... (생략)
eager 로딩 적용
PHP
Copy
foreach (Book::with('author')->get() as $book)
{
echo $book->author->name;
}
- →
Book::with('author')
에서 author 정보를 사용하겠다고 미리 알려줌으로써 쿼리 최소화 (2회)
MySQL
Copy
SELECT * FROM books;
SELECT * FROM authors WHERE id IN (1, 2, 3, ...);
2.2 Ruby On Rails[ | ]
Ruby
Copy
keywords = Keyword.all
keywords.each do |keyword|
keyword.user.id
end
- → (테이블 관계 설명)
keywords
테이블에는users
테이블과 연결시킬 외래키 컬럼을 가지고 있습니다. - →
keywords
에는user.id
정보가 없어서keyword
건수만큼 쿼리 추가 수행 (1+N회)
MySQL
Copy
Keyword Load (2.4ms) SELECT "keywords".* FROM "keywords"
User Load (4.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 9], ["LIMIT", 1]]
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 12], ["LIMIT", 1]]
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 15], ["LIMIT", 1]]
... (생략) ...
preload(선행 로딩) 적용
Ruby
Copy
keywords = Keyword.preload(:user)
keywords.each do |keyword|
keyword.user.id
end
- →
Keyword.preload(:user)
에서users
테이블의 정보를 사전에 사용하겠다고 알려줌으로써 쿼리 최소화 (2회)
MySQL
Copy
Keyword Load (0.6ms) SELECT "keywords".* FROM "keywords" LIMIT $1 [["LIMIT", 11]]
User Load (1.2ms) SELECT "users".* FROM "users" WHERE "users"."id" IN ($1, $2, $3, $4, $5, $6) [["id", 9], ["id", 12], ["id", 15], ["id", 29], ["id", 28], ["id", 24]]
3 같이 보기[ | ]
4 참고[ | ]
편집자 Jmnote
로그인하시면 댓글을 쓸 수 있습니다.