select_related와 prefetch_related는 무엇인가
select_related 와 prefetch_related 는 하나의 QuerySet을 가져올 때, 미리 related objects들까지 다 불러와주는 함수이다. 비록 query를 복잡하게 만들긴 하지만, 그렇게 불러온 data들은 모두 cache에 남아있게 되므로 DB에 다시 접근해야 하는 수고를 덜어줄 수 있다. 이렇게 두 함수 모두 DB에 접근하는 수를 줄여, performance를 향상시켜준다는 측면에서는 공통점이 있지만, 그 방식에는 차이점이 있다.
select_related
- Database에서 JOIN 쿼리를 수행하여 두 테이블의 정보를 가져와서 캐싱
- select_related 은 SQL의 JOIN을 사용하는 특성상 many-to-many 관계에서 사용하는 경우 result set이 너무 거대해질 수 있는 문제가 존재하므로 foreign-key , one-to-one 와 같은 single-valued relationships에서만 사용이 가능
prefetch_related
- select_related 와 달리 별도의 2개의 쿼리를 수행후에 파이썬에서 조인한다.
- 성능은 select 보다 느리지만, many-to-many 관계에서 사용하거나, 역참조시 사용
결론
many-to-many , many-to-one 과 같은 relationships에서는 어쩔 수 없이 prefetch_related 를 사용하여야겠지만, foreign-key , one-to-one 와 같은 single-valued relationships이 있는 곳에서는 최대한 select_related 를 사용하여 query 수를 줄여주는 것이 효과적이다.
'Web > backend' 카테고리의 다른 글
SNS 로그인 flow (0) | 2020.10.24 |
---|---|
AWS django 배포 (0) | 2020.10.24 |
Node.js - introduction (0) | 2020.10.24 |
인증(Authentication) & 인가(Authorization) (0) | 2020.10.24 |
Django polls 앱 (0) | 2020.10.24 |