Cloud Firestore의 색인 유형

색인은 데이터베이스 성능에 중요한 요소입니다. 책에 포함된 여러 주제를 페이지 번호에 연결하는 도서 색인처럼 데이터베이스 색인은 데이터베이스의 항목을 데이터베이스의 항목 위치에 매핑합니다. 데이터베이스에 쿼리를 보내면 데이터베이스가 색인을 사용하여 요청한 항목의 위치를 빠르게 찾을 수 있습니다.

이 페이지에서는 Cloud Firestore에서 사용하는 2가지 색인 유형인 단일 필드 색인복합 색인을 설명합니다.

모든 쿼리에 색인 지원

쿼리에 대한 색인이 없는 경우 대부분의 데이터베이스가 항목별로 콘텐츠를 크롤링하므로 데이터베이스가 커질수록 처리 속도가 느려집니다. Cloud Firestore는 모든 쿼리에 색인을 사용하므로 높은 쿼리 성능이 보장됩니다. 따라서 쿼리 성능은 데이터베이스의 항목 수가 아닌 결과 모음의 크기에 따라 달라집니다.

색인 관리 부담을 줄이고 앱 개발에 집중 가능

Cloud Firestore에는 색인을 관리하는 데 필요한 시간을 줄일 수 있는 기능이 포함되어 있습니다. 대부분의 기본 쿼리에 필요한 색인이 자동으로 생성됩니다. 앱을 사용하고 테스트할 때 Cloud Firestore를 통해 앱에 필요한 추가 색인을 식별하고 생성할 수 있습니다.

색인 유형

Cloud Firestore에서는 2가지 색인 유형인 단일 필드복합을 사용합니다. 2가지 색인 유형은 색인을 생성하는 필드와 각 필드의 색인 모드로 고유하게 정의됩니다.

색인 모드

색인을 정의할 때 색인이 생성되는 각 필드의 색인 모드를 선택합니다. 색인 모드에는 다음과 같이 3가지 옵션이 있습니다.

색인 모드 설명
오름차순 arrow_upward 필드에서 <, <=, ==, >=, > 쿼리 절을 지원하고 이 필드 값을 기준으로 결과의 오름차순 정렬을 지원합니다.
내림차순 arrow_downward 필드에서 <, <=, ==, >=, > 쿼리 절을 지원하고 이 필드 값을 기준으로 결과의 내림차순 정렬을 지원합니다.
배열에 포함 필드에서 array_contains 쿼리 절을 지원합니다.

예를 들어 오름차순 모드의 foo 필드 색인은 내림차순 모드의 foo 필드 색인과 다릅니다.

단일 필드 색인

단일 필드 색인은 특정 필드가 있는 컬렉션에 모든 문서가 정렬된 매핑을 저장합니다. 단일 필드 색인의 각 항목은 특정 필드의 문서 값 및 데이터베이스의 문서 위치를 기록합니다. Cloud Firestore는 문서의 각 필드에 단일 필드 색인을 자동으로 유지합니다.

자동 색인 생성

Cloud Firestore는 기본적으로 문서의 각 필드와 맵의 각 하위 필드에 대한 색인을 자동으로 유지합니다. Cloud Firestore는 자동으로 만들어진 단일 필드 색인에 다음 설정을 사용합니다.

  • 배열과 맵이 아닌 필드의 경우 Cloud Firestore는 2개의 단일 필드 색인을 하나는 오름차순 모드로, 다른 하나는 내림차순으로 정의합니다.

  • 맵 필드의 경우 Cloud Firestore는 맵에서 배열과 맵이 아닌 각 하위 필드에 오름차순 색인 하나와 내림차순 색인 하나를 만듭니다.

  • 문서의 배열 필드의 경우 Cloud Firestore는 배열에 포함 색인을 만들고 유지합니다.

단일 필드 색인 예외

단일 필드 색인 예외를 만들어 자동 색인 생성에서 필드를 제외할 수 있습니다. 색인 생성 예외는 데이터베이스 전체의 자동 색인 설정을 재정의합니다. 예외를 유용하게 활용할 수 있는 경우를 확인하려면 색인 생성 권장사항을 참조하세요.

단일 필드 색인 예외를 만들고 관리하려면 Cloud Firestore의 색인 관리를 참조하세요.

단일 필드 색인에서 지원하는 쿼리의 예

Cloud Firestore가 이러한 색인을 자동으로 만들기 때문에 애플리케이션에서 대부분의 기본 데이터베이스 쿼리를 신속하게 지원할 수 있습니다. 단일 필드 색인을 사용하면 필드 값과 비교 연산자(<, <=, ==, >=, >)를 기반으로 간단한 쿼리를 실행할 수 있습니다. 배열 필드에서는 array_contains 쿼리를 수행할 수 있습니다.

자세히 알아보기 위해 색인 생성의 관점에서 cities 예제를 살펴보겠습니다. 다음 예제는 cities 컬렉션에 city 문서를 여러 개 만들고 각 문서에 name, state, country, capital, population, tags 필드를 설정합니다.

var citiesRef = db.collection("cities");

citiesRef.doc("SF").set({
    name: "San Francisco", state: "CA", country: "USA",
    capital: false, population: 860000,
    regions: ["west_coast", "norcal"] });
citiesRef.doc("LA").set({
    name: "Los Angeles", state: "CA", country: "USA",
    capital: false, population: 3900000,
    regions: ["west_coast", "socal"] });
citiesRef.doc("DC").set({
    name: "Washington, D.C.", state: null, country: "USA",
    capital: true, population: 680000,
    regions: ["east_coast"] });
citiesRef.doc("TOK").set({
    name: "Tokyo", state: null, country: "Japan",
    capital: true, population: 9000000,
    regions: ["kanto", "honshu"] });
citiesRef.doc("BJ").set({
    name: "Beijing", state: null, country: "China",
    capital: true, population: 21500000,
    regions: ["jingjinji", "hebei"] });

Cloud Firestore는 각 set 작업마다 배열이 아닌 필드당 오름차순 단일 필드 색인 1개, 배열이 아닌 필드당 내림차순 단일 필드 색인 1개, 배열 필드에 대해서는 배열에 포함 단일 필드 색인 1개를 업데이트합니다.

Cloud Firestore는 배열 필드를 위한 배열에 포함 단일 필드 색인 1개와 배열이 아닌 필드의 단일 필드 색인 2개를 업데이트합니다. 다음 표의 각 행은 단일 필드 색인의 항목을 나타냅니다.

컬렉션 색인이 생성된 필드
cities arrow_upward name
cities arrow_upward state
cities arrow_upward country
cities arrow_upward capital
cities arrow_upward population
cities arrow_downward name
cities arrow_downward state
cities arrow_downward country
cities arrow_downward capital
cities arrow_downward population
cities array-contains regions

자동으로 생성된 색인을 사용하여 다음과 같은 간단한 쿼리를 실행할 수 있습니다.

citiesRef.where("state", "==", "CA")
citiesRef.where("population", "<", 100000)
citiesRef.where("name", ">=", "San Francisco")

array_contains 색인을 사용하면 다음과 같은 regions 배열 필드를 쿼리할 수 있습니다.

citiesRef.where("regions", "array-contains", "west_coast")

등식(==)을 기반으로 복합 쿼리를 만들 수도 있습니다.

citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA").where("capital", "==", false).where("state", "==", "CA").where("population", "==", 860000)

범위 비교(<, <=, >, >=)를 사용하는 복합 쿼리를 실행해야 하거나 다른 필드로 정렬해야 하는 경우에는 해당 쿼리에 대한 복합 색인을 만들어야 합니다.

복합 색인

복합 색인은 필드 1개가 아닌 여러 특정 필드가 포함된 컬렉션에 모든 문서가 정렬된 매핑을 저장합니다. 또한 복합 색인은 각 필드에 대한 색인 모드(오름차순, 내림차순, 배열에 포함)를 정의하며 색인은 이러한 색인 모드에 따라 정렬됩니다.

Cloud Firestore는 복합 색인을 사용하여 단일 필드 색인에서 아직 지원하지 않는 복합 쿼리를 지원합니다. 예를 들어 다음 쿼리의 경우 복합 색인이 필요합니다.

citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)

이러한 쿼리에 아래의 복합 색인이 필요합니다. 쿼리가 country 필드에 등식을 사용하므로 필드의 색인 모드는 내림차순이거나 오름차순일 수 있습니다. 기본적으로 부등호 쿼리는 부등호 절의 필드를 기준으로 오름차순 정렬이 적용됩니다.

컬렉션 색인이 생성된 필드
cities arrow_upward(또는 arrow_downward) country, arrow_upward population

가능한 필드 조합 수가 많기 때문에, Cloud Firestore에서는 단일 필드 색인과는 달리 복합 색인의 경우에는 자동으로 만들지 않습니다. Cloud Firestore를 사용하면 앱을 빌드할 때 필요한 복합 색인을 식별하고 생성할 수 있습니다.

필수 색인부터 만들지 않고 위의 쿼리를 시도하면 Cloud Firestore에서 링크가 포함된 오류 메시지를 반환합니다. 이 링크로 이동하면 누락된 색인을 만들 수 있습니다. 색인에서 지원하지 않는 쿼리를 시도할 때마다 이런 오류가 발생합니다. 또한 콘솔이나 Firebase CLI를 사용하여 직접 복합 색인을 정의하고 관리할 수 있습니다. 색인 생성 및 관리에 대한 자세한 내용은 색인 관리를 참조하세요.

동일한 쿼리를 내림차순으로 정렬하여 실행하려면 population에 대한 내림차순으로 추가 복합 색인이 있어야 합니다.

citiesRef.where("country", "==", "USA").orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", "<", 3800000)
         .orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", ">", 690000)
         .orderBy("population", "desc")
컬렉션 색인이 생성된 필드
cities arrow_upward country, arrow_upward population
cities arrow_upward country, arrow_downward population

array_contains 쿼리와 추가 절을 결합하려면 복합 색인을 만들어야 합니다.

citiesRef.where("regions", "array_contains", "east_coast")
         .where("capital", "==", true)
컬렉션 색인이 생성된 필드
cities array-contains tags, arrow_upward(또는 arrow_downward) capital

색인 및 가격 책정

색인 비용은 애플리케이션의 저장소 비용에 추가됩니다. 색인의 저장소 크기가 계산되는 방식을 자세히 알아보려면 색인 항목 크기를 참조하세요.

색인 병합 활용

Cloud Firestore에서 모든 쿼리에 색인을 사용하지만 쿼리마다 색인이 하나씩 필요한 것은 아닙니다. 여러 등식(==) 절 및 orderBy 절(선택사항)이 있는 쿼리의 경우 Cloud Firestore에서 기존 색인을 재사용할 수 있습니다. Cloud Firestore가 간단한 등식 필터용으로 색인을 병합하여 크기가 큰 등식 쿼리에 필요한 복합 색인을 만들 수 있습니다.

색인 병합을 활용할 수 있는 상황을 파악하면 색인 비용을 줄일 수 있습니다. 예를 들어 레스토랑 별점 앱의 restaurants 컬렉션을 가정해서 설명해 보겠습니다.

  • collections_bookmark restaurants

    • class burgerthyme

      name : "Burger Thyme"
      category : "burgers"
      city : "San Francisco"
      editors_pick : true
      star_rating : 4

이제 이 앱이 아래와 같은 쿼리를 사용한다고 가정해 보겠습니다. 앱이 category, city, editors_pick에 등식 절의 조합을 사용하지만 항상 오름차순 star_rating으로 정렬합니다.

db.collection("restaurants").where("category", "==", "burgers")
                            .orderBy("star_rating")

db.collection("restaurants").where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==" "San Francisco")
                            .where("editors_pick", "==", true )
                            .orderBy("star_rating")

각 쿼리에 대한 색인을 만들 수 있습니다.

컬렉션 색인이 생성된 필드
restaurants arrow_upward category, arrow_upward star_rating
restaurants arrow_upward city, arrow_upward star_rating
restaurants arrow_upward category, arrow_upward city, arrow_upward star_rating
restaurants arrow_upward category, arrow_upward city, arrow_upward editors_pick, arrow_upward star_rating

보다 나은 방법으로는 Cloud Firestore의 등식 절 색인 병합 기능을 활용하여 색인 수를 줄일 수 있습니다.

컬렉션 색인이 생성된 필드
restaurants arrow_upward category, arrow_upward star_rating
restaurants arrow_upward city, arrow_upward star_rating
restaurants arrow_upward editors_pick, arrow_upward star_rating

색인 모음의 크기가 더 작을 뿐만 아니라 추가 쿼리도 지원합니다.

db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

색인 생성 한도

색인에 대한 한도는 다음과 같습니다. 모든 할당량과 한도는 할당량 및 한도를 참조하세요.

한도 세부정보
데이터베이스의 최대 복합 색인 수 200
데이터베이스의 최대 단일 필드 색인 예외 수 200

각 문서의 최대 색인 항목 수

40,000

색인 항목 수는 문서 내 다음 항목의 총합입니다.

  • 단일 필드 색인 항목 수
  • 복합 색인 항목 수
색인 항목의 최대 크기

7.5KiB

Cloud Firestore에서 색인 항목 크기를 계산하는 방식을 확인하려면 색인 항목 크기를 참조하세요.

문서의 색인 항목 크기 최대 총합

8MiB

전체 크기는 문서의 다음 항목에 대한 총합입니다.

  • 문서의 단일 필드 색인 항목 크기 총합
  • 문서의 복합 필드 색인 항목 크기 총합
  • 색인 필드 값의 최대 크기

    1,500바이트

    1,500바이트를 초과하는 필드 값은 잘립니다. 잘린 필드 값을 포함하는 쿼리는 일관성 없는 결과를 반환할 수 있습니다.

    색인 생성 권장사항

    대부분의 앱에서는 자동 색인 생성 및 오류 메시지 링크를 사용하여 색인을 관리할 수 있습니다. 하지만 다음과 같은 경우에는 단일 필드 예외를 추가할 수 있습니다.

    케이스 설명
    큰 문자열 필드

    쿼리에 사용하지 않는 긴 문자열 값이 포함된 문자열 필드가 있는 경우 색인 생성에서 해당 필드를 제외하여 저장소 비용을 줄일 수 있습니다.

    순차 값이 있는 문서를 포함하는 컬렉션에 대한 높은 쓰기 속도

    컬렉션의 문서 사이에 타임스탬프처럼 순차적으로 증가하거나 감소하는 필드의 색인을 생성하는 경우 컬렉션에 대한 최대 쓰기 속도는 초당 500회입니다. 순차 값이 있는 필드를 기준으로 쿼리하지 않는 경우 색인 생성에서 이 필드를 제외하여 이 한도를 우회할 수 있습니다.

    예를 들어 쓰기 속도가 높은 IoT 사용 사례에서 타임스탬프 필드가 있는 문서가 포함된 컬렉션은 초당 500회 한도에 근접할 수 있습니다.

    큰 배열 또는 맵 필드

    큰 배열 또는 맵 필드는 문서당 색인 한도인 20,000개에 근접할 수 있습니다. 큰 배열 또는 맵 필드를 기준으로 쿼리하지 않는 경우 색인 생성에서 큰 배열 또는 맵 필드를 제외해야 합니다.

    다음에 대한 의견 보내기...

    도움이 필요하시나요? 지원 페이지를 방문하세요.