/ python

performance tip - mongoengine select_related

Python에서 MongoDB ODM(Object Document Mapper)으로 mongoengine을 사용하고 있다.

특히 relation 관계를 표현할때 select_related 이 메서드를 활용하면 N+1 쿼리를 방지 할수 있는데 이때 주의점이 있다.

문제코드

파이썬에는 slicing이라는 array 형태의 데이터를 다루기 좋은 문법이 있다.
이걸 아래 코드 처럼 사용했는데 실제 쿼리에 limit와 skip이 누락된채 쿼리가 되었다.

ASIS

Post.objects().order_by('-id').select_related()[start:end]

전체 결과 갖고 온 후 slicing이 일어나기 때문에 엄청 결과가 느렸다.

TOBE

Post.objects().order_by('-id')[start:end].select_related()
# or
Post.objects().order_by('-id').limit(size).skip(start).select_related()

먼저 slicing을 한 이후 select_related() 메서드를 호출하거나 아니면 limit와 skip 메서드를 직접 사용하면 된다.