[Firestore] 5편 - 색인(Index)
https://firebase.google.com/docs/firestore/query-data/index-overview
https://firebase.google.com/docs/firestore/query-data/indexing?authuser=0
저번 포스팅에서 단순 쿼리, 복합 쿼리, 컬렉션 그룹 쿼리에 대해서 정리했다.
복합 쿼리의 경우 쿼리 조건에 따라 색인 생성이 필요한 경우가 있었다.
또한 컬렉션 그룹 쿼리도 색인 생성이 필요했다.
색인이 정확하게 어떠한 방식으로 저장되는지 가이드 문서에서 너무 대충 설명 해줘서 포스팅을 적다가 오포스팅이 될 것 같기도 하고, 색인이 실제로 어떻게 저장되는지는 몰라도 콘솔에서 간단하게 설정가능하여 확실한 부분만 정리했다.
데이터베이스 색인이란
https://itholic.github.io/database-index/
Firestore 색인
이전 포스팅 4편에서 쿼리 클래스 메서드는 Firestore 색인을 통해 쿼리 조건에 해당하는 문서들을 가져온다.
단일 필드 색인의 경우 Firebase에서 자동으로 관리해주기 때문에 직접 생성해줄 필요가 없다.
쿼리 범위
쿼리 범위에 따라 collection scope, collection group scope로 나뉨
collection scope(컬렉션 스코프) - 하나의 컬렉션에서만 쿼리를 지원
collection group(컬렉션 그룹 스코프) - 동일한 이름의 여러 컬렉션들에서 쿼리를 지원
색인 종류
필드 구성에 따라 single field index, composite index로 나뉜다.
single field index(단일 필드 색인) - 필드 하나로 구성된 색인
composite index(복합 색인) - 필드 여러개로 구성된 색인
각 색인을 만들 때 어떤 스코프 색인들을 생성할 것인지 정할 수 있다.
Firestore의 기본으로 해주는 자동 인덱싱
Firestore는 문서들에 필드가 추가되면 자동으로 컬렉션 스코프의 단일 필드 색인만 추가(및 관리)시켜준다.
딱 거기까지다.
복합 색인은 필드 결합 경우의 수가 많아 직접 생성하라고 하고있고
컬렉션 그룹 스코프 단일 필드 색인 또한 직접 생성해서 컬렉션 그룹 쿼리를 사용해야 한다.
컬렉션 스코프 단일 필드 색인을 정확히 어떻게 만드는지 구체적으로 안나와있다. 문서가 부실해서 정확히 유추가 안되지만 적어본다.
단일 필드 색인에는 필드의 값과 문서의 위치가 기록된다.
(라고 나와있는데 밑으로 갈 수록 정말인지 어떻게 저장하는지 개판으로 써놨다)
1. non배열,맵 타입 필드
각 필드- 컬렉션 스코프인 필드명 색인 두개(오름차순, 내림차순)가 생성됨 (필드값, 문서위치)
2. 배열
각 배열 필드 - 컬렉션 스코프의 array-contains 색인을 생성한다.
3. 맵
각 맵 필드 - 맵의 sub 필드가 non배열,맵 타입이면 각 sub필드마다 색인 두개(오름,내림)를 생성한다.( 1번 동작 )
이외에 아무 내용도 안적혀있어서 아마 sub필드가 배열이면 2번 동작으로 저장되고, sub필드가 맵이면 1번 동작을 반복하여 가장 하위 레벨까지 가는 것 같다.
컬렉션 스코프의 단일 필드 색인은 Firestore가 항상 자동으로 생성해주기 때문에
-> 단일 필드 색인의 설정 제목이 생성이 아니라 예외 추가로 되어있음
색인 예외는 데이터베이스 색인을 오버라이딩 하기 때문에
예외 추가를 하지 않으면 Firestore에서 제공해주는 색인이 사용되고, 예외 추가를 하면 오버라이딩 되어 사용자가 생성한 색인이 사용된다.
맵 단일 필드 색인에 예외추가를 하면, 맵의 sub필드들 모두 예외추가 셋팅을 통해 색인을 생성한다?
그렇지만 sub필드들도 예외추가를 따로 할 수 있다.
복합 색인
복합 색인의 필드 구성중 배열 필드는 하나만 지정할 수 있다.
Firestore는 단일 필드 색인을 통해 지원하지 않는 쿼리들은 복합 색인 생성을 통해 쿼리를 사용한다.
전편 포스팅의 복합 쿼리 부분을 보면 색인 생성을 하지 않으면 동작하지 않는 쿼리들이 있었다.
색인 생성이 필수인 쿼리를 색인 생성을 하지 않고 사용하면 빠진 색인을 생성하라는 링크를 담긴 에러 메세지를 리턴해준다.(실패 리스너의 exception을 통해 받을 수 있다)
인덱스 모드 - 복잡하게 생각할 필요없이 콘솔에서 설정해줘야 하는 것.
단일 필드 색인에서 설정할 경우 체크박스로 되어있다.
배열 색인 사용하지 않으면 배열관련 메서드를 사용하지 못하고
오름차순, 내림차순 모두 사용하지 않는 경우에 관련 메서드를 사용하지 못한다.
(전편 참고)
복합 색인에서 설정할 경우 필드가 세개고 세개 모두 체크한다면 3x3으로 9개의 색인이 생성되어버린다.
그래서 세가지중 하나씩 지정하여 색인을 생성하도록 해놨다.