Firebase는 데이터에 대해 임의의 하위 키를 사용하는 임시 쿼리를 허용합니다. 색인을 미리 계획할 수 있으면 Firebase 실시간 데이터베이스 보안 규칙에서 .indexOn
규칙을 통해 색인을 정의하여 쿼리 성능을 높일 수 있습니다.
데이터 색인 정의
Firebase는 데이터 정렬 및 쿼리를 위한 강력한 도구를 제공합니다. 특히 Firebase는 노드 컬렉션에 대해 임의의 공통 하위 키를 사용한 즉석 쿼리를 허용합니다. 이 쿼리는 앱의 규모가 커질수록 성능이 저하됩니다. 그러나 쿼리 대상 키를 Firebase에 미리 알리면 Firebase가 서버에서 이 키를 색인화하여 쿼리 성능이 향상됩니다.
orderByChild로 색인 생성
예제를 통해 알기 쉽게 설명해 드리겠습니다. Firebase 개발팀 모두는 공룡을 매우
좋아해서 공룡을 예로 들어보겠습니다. 다음은 공룡 자료 샘플 데이터베이스의 스니펫입니다. 이 스니펫을 사용하여 .indexOn
와 orderByChild()
를 함께 사용하는 방법을 설명하려 합니다.
{ "lambeosaurus": { "height" : 2.1, "length" : 12.5, "weight": 5000 }, "stegosaurus": { "height" : 4, "length" : 9, "weight" : 2500 } }
앱에서 공룡을 이름, 키, 길이 순으로 자주 정렬하지만 무게로는 정렬하지 않는다고 가정하겠습니다. Firebase에 이 정보를 미리 알리면 쿼리의 성능을 높일 수
있습니다. 공룡의 이름 자체가 레코드의 키이므로 Firebase에서 이미 공룡 이름으로 쿼리가 최적화된 상태입니다.
.indexOn
을 사용하여 Firebase에 높이 및 길이에 대한 쿼리를 최적화하도록 지시할 수도 있습니다.
{ "rules": { "dinosaurs": { ".indexOn": ["height", "length"] } } }
다른 규칙과 마찬가지로 규칙의 모든 수준에서 .indexOn
규칙을 지정할 수 있습니다.
위 예시에서는 모든 공룡 데이터가 데이터베이스의 루트에 저장되어 있으므로 규칙을 루트 수준에 배치했습니다.
orderByValue로 색인 생성
이 예시에서는 .indexOn
과 orderByValue()
를 함께 사용하는 방법을 보여줍니다.
다음 데이터로 공룡 운동경기 점수 리더보드를 만든다고 가정해 보겠습니다.
{ "scores": { "bruhathkayosaurus" : 55, "lambeosaurus" : 21, "linhenykus" : 80, "pterodactyl" : 93, "stegosaurus" : 5, "triceratops" : 22 } }
orderByValue()를 사용하여 리더보드를 만들려고 하므로 /scores
노드에 .value
규칙을 추가하여 쿼리를 최적화할 수 있습니다.
{ "rules": { "scores": { ".indexOn": ".value" } } }