Parse-server를 PostgreSQL로 사용하실 때 인덱싱 팁


(InGrowth) #1

저는 parse-server를 PostgreSQL에 물려서 사용하고 있습니다.

Mongodb를 사용할 때와 거의 차이는 없으면서도 RDB적 쿼리가 필요할 때 유용하고요.

무엇보다 AWS의 RDS를 사용할 수 있기 때문에 관리적 편익이 아주 큽니다.


Mongodb를 사용할 때도 데이터가 늘면 인덱싱에 신경 써 주어야 하듯 PostgreSQL에서도 인덱싱이 성능과 직결됩니다.

그중에 parse-server를 사용하면서 가장 편리한 기능중 하나인 ACL(Access Control List)과 관련된 인덱싱을 꼭 해주셔야 합니다.

ACL은 아주 매력적인 기능인데요. Object 레벨로 권한을 설정할 수 있기 때문에 너무나도 좋습니다.
자세한 내용은 https://docs.parseplatform.org/js/guide/#object-level-access-control

이건 예를 들기 위해 가져온 게시물 정보를 담고 있는 Posts 테이블 입니다.
(사용한 도구는 pgAdmin4 입니다. 성능관리와 인덱싱 등 작업을 웹UI로 할 수 있어요)

이중에 _rperm 와 _wperm 이 보이는데요. 타입은 text[], 텍스트 배열 이군요.
이름에서 유추가 가능하듯 이 컬럼에 ACL의 Read, Write 권한에 대한 key가 들어 있습니다.


이번에는 실제로 Posts 테이블의 인덱스를 보겠습니다.

Primary Key에 해당하는 Unique 인덱스 말고는 모두 제가 설정해준 것인데요.

코드 상에서 검색조건에 사용되는 컬럼은 죄다 인덱스를 잡아뒀습니다.
(이 테이블에 레코드 수가 200백만 건 정도 되다보니 인덱스가 없는 컬럼을 검색조건에 넣으면 쿼리가 무지하게 오래 걸려서 그렇습니다.)

게다가 Posts 테이블은 ACL을 사용하여 사용자 별로 볼 수 있는 게시물이 다릅니다.
그러다 보니 대부분의 인덱스에 _rperm 이 들어 있습니다.


저는 Posts 테이블의 쿼리가 느려서 슬로우 쿼리를 분석해가면서 인덱스를 잡아줬습니다.

하지만 레코드가 적은 일반적인 경우에서는 많은 인덱스가 꼭 필요하진 않습니다.

하지만 ACL을 사용하신다면 검색조건에 해당하는 컬럼과 함께 _rperm 컬럼을 꼭 같이 인덱스로 잡아주시기 바랍니다.


(이종은(Jong Lee)) #2

상세한 팁 감사합니다! 이제 AWS RDS를 쓰는 쪽으로 저도 방향을 바꿔야겠네요.
:+1: :pray:

그런데 저 캡쳐에 있는 애플리케이션은 어떤건가요?


(InGrowth) #3

아차차ㅋㅋ pgAdmin4 입니다. 해가 지나기 전에 쓰려고 두서 없이 썼네요.