Python에서 MongoDB ODM(Object Document Mapper)으로 mongoengine을 사용하고 있다.
특히 relation 관계를 표현할때 select_related 이 메서드를 활용하면 N+1 쿼리를 방지 할수 있는데 이때 주의점이 있다.
파이썬에는 slicing이라는 array 형태의 데이터를 다루기 좋은 문법이 있다.
이걸 아래 코드 처럼 사용했는데 실제 쿼리에 limit와 skip이 누락된채 쿼리가 되었다.
Post.objects().order_by('-id').select_related()[start:end]
전체 결과 갖고 온 후 slicing이 일어나기 때문에 엄청 결과가 느렸다.
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 메서드를 직접 사용하면 된다.