获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Tipos de índice en Cloud Firestore

Los índices son un factor importante en el rendimiento de una base de datos. Al igual que el índice de un libro que asigna los temas de un libro a los números de página, el índice de una base de datos asigna los elementos de una base de datos a sus ubicaciones en la base de datos. Cuando envía una consulta a una base de datos, la base de datos puede usar un índice para buscar rápidamente las ubicaciones de los elementos que solicitó.

Esta página describe los dos tipos de índices que usa Cloud Firestore, índices de un solo campo e índices compuestos .

Un índice detrás de cada consulta

Si no existe un índice para una consulta, la mayoría de las bases de datos rastrean su contenido elemento por elemento, un proceso lento que se ralentiza aún más a medida que crece la base de datos. Cloud Firestore garantiza un alto rendimiento de consultas mediante el uso de índices para todas las consultas. Como resultado, el rendimiento de las consultas depende del tamaño del conjunto de resultados y no del número de elementos de la base de datos.

Menos gestión de índices, más desarrollo de aplicaciones

Cloud Firestore incluye funciones que reducen la cantidad de tiempo que necesita para administrar índices. Los índices necesarios para las consultas más básicas se crean automáticamente para usted. A medida que usa y prueba su aplicación, Cloud Firestore lo ayuda a identificar y crear índices adicionales que requiere su aplicación.

Tipos de índice

Cloud Firestore usa dos tipos de índices: de un solo campo y compuestos . Además de la cantidad de campos indexados, los índices compuestos y de un solo campo difieren en la forma en que los administra.

Índices de un solo campo

Un índice de un solo campo almacena una asignación ordenada de todos los documentos de una colección que contienen un campo específico. Cada entrada en un índice de un solo campo registra el valor de un documento para un campo específico y la ubicación del documento en la base de datos. Cloud Firestore usa estos índices para realizar muchas consultas básicas. Los índices de un solo campo se administran configurando la configuración de indexación automática de la base de datos y las exenciones de índice.

Indexación automática

De forma predeterminada, Cloud Firestore mantiene automáticamente índices de un solo campo para cada campo en un documento y cada subcampo en un mapa. Cloud Firestore usa la siguiente configuración predeterminada para los índices de un solo campo:

  • Para cada campo que no es de matriz ni de mapa, Cloud Firestore define dos índices de campo único de alcance de colección , uno en modo ascendente y otro en modo descendente.

  • Para cada campo de mapa, Cloud Firestore crea un índice ascendente de alcance de colección y un índice descendente para cada subcampo que no sea de matriz ni de mapa en el mapa.

  • Para cada campo de matriz en un documento, Cloud Firestore crea y mantiene un índice de contenido de matriz de alcance de colección.

  • Los índices de campo único con ámbito de grupo de recopilación no se mantienen de forma predeterminada.

Exenciones de índice de un solo campo

Puede eximir un campo de su configuración de indexación automática creando una exención de índice de un solo campo. Una exención de indexación anula la configuración de indexación automática de toda la base de datos. Una exención puede habilitar un índice de campo único que su configuración de indexación automática deshabilitaría o deshabilitaría un índice de campo único que de otro modo habilitaría la indexación automática. Para casos en los que las exenciones pueden ser útiles, consulte las mejores prácticas de indexación .

Si crea una exención de índice de campo único para un campo de mapa, los subcampos del mapa heredan esa configuración. Sin embargo, puede definir exenciones de índice de un solo campo para subcampos específicos. Si elimina una exención para un subcampo, el subcampo heredará la configuración de exención de su principal, si existe, o la configuración de toda la base de datos si no existen exenciones principales.

Para crear y administrar exenciones de índices de un solo campo, consulte Administrar índices en Cloud Firestore .

índices compuestos

Un índice compuesto almacena un mapeo ordenado de todos los documentos en una colección, basado en una lista ordenada de campos para indexar.

Cloud Firestore usa índices compuestos para admitir consultas que aún no son compatibles con los índices de un solo campo.

Cloud Firestore no crea automáticamente índices compuestos como lo hace con los índices de un solo campo debido a la gran cantidad de combinaciones de campos posibles. En su lugar, Cloud Firestore lo ayuda a identificar y crear los índices compuestos requeridos a medida que crea su aplicación.

Si intenta la consulta anterior sin crear primero el índice requerido, Cloud Firestore devuelve un mensaje de error que contiene un enlace que puede seguir para crear el índice que falta. Esto sucede cada vez que intenta realizar una consulta que no es compatible con un índice. También puede definir y administrar índices compuestos manualmente mediante la consola o mediante Firebase CLI . Para obtener más información sobre la creación y administración de índices compuestos, consulte Administración de índices .

Modos de índice y ámbitos de consulta

Los índices compuestos y de un solo campo se configuran de manera diferente, pero ambos requieren que configure los modos de índice y los ámbitos de consulta para sus índices.

Modos de índice

Cuando define un índice, selecciona un modo de índice para cada campo indexado. El modo de índice de cada campo admite cláusulas de consulta específicas en ese campo. Puede seleccionar entre los siguientes modos de índice:

Modo de índice Descripción
Ascendente Admite < , <= , == , >= , > , != , in y not-in , cláusulas de consulta en el campo y admite la clasificación de resultados en orden ascendente en función de este valor de campo.
Descendente Admite cláusulas de consulta < , <= , == , >= , > , != , in y not-in en el campo y admite la clasificación de los resultados en orden descendente en función de este valor de campo.
Array-contiene Admite cláusulas de consulta array-contains y array-contains-any en el campo.

Ámbitos de consulta

Cada índice tiene como ámbito una colección o un grupo de colección. Esto se conoce como el ámbito de consulta del índice:

Alcance de la colección
Cloud Firestore crea índices con alcance de colección de forma predeterminada. Estos índices admiten consultas que devuelven resultados de una sola colección.

Alcance del grupo de colección
Un grupo de colección incluye todas las colecciones con el mismo ID de colección. Para ejecutar una consulta de grupo de recopilación que devuelva resultados filtrados u ordenados de un grupo de recopilación, debe crear un índice correspondiente con el ámbito del grupo de recopilación.

Ejemplo de indexación

Al crear automáticamente índices de un solo campo para usted, Cloud Firestore permite que su aplicación admita rápidamente las consultas de bases de datos más básicas. Los índices de campo único le permiten realizar consultas simples basadas en valores de campo y los comparadores < , <= , == , >= , > y in . Para los campos de matriz, le permiten realizar consultas array-contains y array-contains-any .

Para ilustrar, examine los siguientes ejemplos desde el punto de vista de la creación de índices. El siguiente fragmento crea algunos documentos de city en una colección de cities y establece campos de name , state , country , capital , population y tags para cada documento:

Web
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"] });

Asumiendo la configuración de indexación automática predeterminada, Cloud Firestore actualiza un índice de campo único ascendente por campo que no es de matriz, un índice de campo único descendente por campo que no es de matriz y un índice de campo único que contiene una matriz para el campo de matriz. Cada fila de la siguiente tabla representa una entrada en un índice de un solo campo:

Recopilación Campo indexado Alcance de la consulta
ciudades nombre Recopilación
ciudades estado Recopilación
ciudades país Recopilación
ciudades capital Recopilación
ciudades población Recopilación
ciudades nombre Recopilación
ciudades estado Recopilación
ciudades Recopilación
ciudades capital Recopilación
ciudades población Recopilación
ciudades array-contains regiones Recopilación

Consultas admitidas por índices de un solo campo

Con estos índices de un solo campo creados automáticamente, puede ejecutar consultas simples como las siguientes:

Web
const stateQuery = citiesRef.where("state", "==", "CA");
const populationQuery = citiesRef.where("population", "<", 100000);
const nameQuery = citiesRef.where("name", ">=", "San Francisco");

También puede crear consultas in igualdad compuesta ( == ):

Web
citiesRef.where('country', 'in', ["USA", "Japan", "China"])

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

Si necesita ejecutar una consulta compuesta que use una comparación de rango ( < , <= , > o >= ) o si necesita ordenar por un campo diferente, debe crear un índice compuesto para esa consulta.

El índice array-contains le permite consultar el campo de matriz de regions :

Web
citiesRef.where("regions", "array-contains", "west_coast")
// array-contains-any and array-contains use the same indexes
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])

Consultas admitidas por índices compuestos

Cloud Firestore usa índices compuestos para admitir consultas compuestas que aún no son compatibles con los índices de un solo campo. Por ejemplo, necesitaría un índice compuesto para las siguientes consultas:

Web
citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)

Estas consultas requieren el índice compuesto a continuación. Dado que la consulta utiliza una igualdad ( == o in ) para el campo de country , puede utilizar un modo de índice ascendente o descendente para este campo. De forma predeterminada, las cláusulas de desigualdad aplican un orden de clasificación ascendente basado en el campo de la cláusula de desigualdad.

Recopilación Campos indexados Alcance de la consulta
ciudades (o ) país, población Recopilación

Para ejecutar las mismas consultas pero con un orden de clasificación descendente, necesita un índice compuesto adicional en la dirección descendente para la population :

Web
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")

citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)
         .orderBy("population", "desc")
Recopilación Campos indexados Alcance de la consulta
ciudades país, población Recopilación
ciudades país , población Recopilación

También debe crear un índice compuesto para combinar una consulta array-contains o array-contains-any con cláusulas adicionales.

Web
citiesRef.where("regions", "array-contains", "east_coast")
         .where("capital", "==", true)

// array-contains-any and array-contains use the same index
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
         .where("capital", "==", true)
Recopilación Campos indexados Alcance de la consulta
ciudades array-contiene etiquetas, (o ) capital Recopilación

Consultas admitidas por índices de grupos de colecciones

Para demostrar un índice con alcance de grupo de colección, imagine que agrega una subcolección de landmarks de referencia a algunos de los documentos de la city :

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

citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Bridge",
    category : "bridge" });
citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Park",
    category : "park" });

citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Gallery of Art",
    category : "museum" });
citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Mall",
    category : "park" });

Con el siguiente índice de campo único con alcance de colección, puede consultar la colección de puntos de landmarks de una sola ciudad en función del campo de category :

Recopilación Campos indexados Alcance de la consulta
puntos de referencia (o ) Recopilación
Web
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])

Ahora, imagine que está interesado en consultar los puntos de referencia de todas las ciudades. Para ejecutar esta consulta en el grupo de colección que consta de todas las colecciones de landmarks de referencia, debe habilitar un índice de campo único de landmarks de referencia con el alcance del grupo de colección:

Recopilación Campos indexados Alcance de la consulta
puntos de referencia (o ) grupo de colección

Con este índice habilitado, puede consultar el grupo de recopilación de landmarks de referencia:

Web
var landmarksGroupRef = db.collectionGroup("landmarks");

landmarksGroupRef.where("category", "==", "park")
landmarksGroupRef.where("category", "in", ["park", "museum"])

Para ejecutar una consulta de grupo de recopilación que devuelva resultados filtrados u ordenados, debe habilitar un índice compuesto o de campo único correspondiente con ámbito de grupo de recopilación. Sin embargo, las consultas de grupos de colecciones que no filtran ni ordenan los resultados no requieren definiciones de índice adicionales.

Por ejemplo, puede ejecutar la siguiente consulta de grupo de recopilación sin habilitar un índice adicional:

Web
db.collectionGroup("landmarks").get()

Entradas de índice

Los índices configurados de su proyecto y la estructura de un documento determinan el número de entradas de índice para un documento. Las entradas de índice cuentan para el límite de recuento de entradas de índice.

El siguiente ejemplo muestra las entradas de índice de un documento.

Documento

/cities/SF

city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]

Índices de un solo campo

  • nombre_ciudad ASC
  • nombre_ciudad DESC
  • temperaturas.verano ASC
  • temperaturas.verano DESC
  • temperaturas.invierno ASC
  • temperaturas.invierno DESC
  • Vecindarios Array Contiene (ASC y DESC)

Índices compuestos

  • city_name ASC, barrios ARRAY
  • city_name DESC, barrios ARRAY

Entradas de índice

Esta configuración de indexación da como resultado las siguientes 18 entradas de índice para el documento:

Índice Datos indexados
Entradas de índice de un solo campo
nombre_ciudad ASC city_name: "San Francisco"
nombre_ciudad DESC city_name: "San Francisco"
temperaturas.verano ASC temperaturas.verano: 67
temperaturas.verano DESC temperaturas.verano: 67
temperaturas.invierno ASC temperaturas.invierno: 55
temperaturas.invierno DESC temperaturas.invierno: 55
vecindarios La matriz contiene ASC barrios: "Misión"
vecindarios Array Contiene DESC barrios: "Misión"
vecindarios La matriz contiene ASC barrios: "Centro"
vecindarios Array Contiene DESC barrios: "Centro"
vecindarios La matriz contiene ASC barrios: "Marina"
vecindarios Array Contiene DESC barrios: "Marina"
Entradas de índice compuesto
city_name ASC, barrios ARRAY city_name: "San Francisco", barrios: "Misión"
city_name ASC, barrios ARRAY city_name: "San Francisco", barrios: "Downtown"
city_name ASC, barrios ARRAY city_name: "San Francisco", barrios: "Marina"
city_name DESC, barrios ARRAY city_name: "San Francisco", barrios: "Misión"
city_name DESC, barrios ARRAY city_name: "San Francisco", barrios: "Downtown"
city_name DESC, barrios ARRAY city_name: "San Francisco", barrios: "Marina"

Índices y precios

Los índices contribuyen a los costos de almacenamiento de su aplicación. Para obtener más información sobre cómo se calcula el tamaño de almacenamiento para los índices, consulte Tamaño de entrada de índice .

Aprovechando la fusión de índices

Aunque Cloud Firestore usa un índice para cada consulta, no necesariamente requiere un índice por consulta. Para consultas con varias cláusulas de igualdad ( == ) y, opcionalmente, una cláusula orderBy , Cloud Firestore puede reutilizar los índices existentes. Cloud Firestore puede fusionar los índices para filtros de igualdad simples a fin de crear los índices compuestos necesarios para consultas de igualdad más grandes.

Puede reducir los costos de indexación identificando situaciones en las que puede aprovechar la combinación de índices. Por ejemplo, imagine una colección de restaurants para una aplicación de clasificación de restaurantes:

  • restaurantes

    • hamburguesa

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

Ahora, imagine que esta aplicación usa consultas como las siguientes. Tenga en cuenta que la aplicación usa combinaciones de cláusulas de igualdad para category , city y editors_pick mientras que siempre ordena por star_rating ascendente :

Web
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")

Puede crear un índice para cada consulta:

Recopilación Campos indexados Alcance de la consulta
restaurantes categoría, star_rating Recopilación
restaurantes ciudad, star_rating Recopilación
restaurantes categoría, ciudad, star_rating Recopilación
restaurantes categoría, ciudad, editors_pick, star_rating Recopilación

Como una mejor solución, puede reducir la cantidad de índices aprovechando la capacidad de Cloud Firestore para fusionar índices para cláusulas de igualdad:

Recopilación Campos indexados Alcance de la consulta
restaurantes categoría, star_rating Recopilación
restaurantes ciudad, star_rating Recopilación
restaurantes editors_pick, star_rating Recopilación

Este conjunto de índices no solo es más pequeño, sino que también admite una consulta adicional:

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

Límites de indexación

Los siguientes límites se aplican a los índices. Para todas las cuotas y límites, consulte Cuotas y límites .

Límite Detalles
Número máximo de índices compuestos para una base de datos 200
Número máximo de configuraciones de un solo campo para una base de datos

200

Se permiten un total de 200 configuraciones a nivel de campo. Una configuración de campo puede contener varias configuraciones para el mismo campo. Por ejemplo, una exención de indexación de un solo campo y una política TTL en el mismo campo cuentan como una configuración de campo hacia el límite.

Número máximo de entradas de índice para cada documento

40.000

El número de entradas de índice es la suma de lo siguiente para un documento:

  • El número de entradas de índice de un solo campo
  • El número de entradas de índice compuesto

Para ver cómo Cloud Firestore convierte un documento y un conjunto de índices en entradas de índice, consulte este ejemplo de recuento de entradas de índice .

Número máximo de campos en un índice compuesto 100
Tamaño máximo de una entrada de índice

7,5 KiB

Para ver cómo Cloud Firestore calcula el tamaño de la entrada de índice, consulte tamaño de entrada de índice .

Suma máxima de los tamaños de las entradas de índice de un documento

8 MB

El tamaño total es la suma de lo siguiente para un documento:

  • La suma del tamaño de las entradas de índice de un solo campo de un documento
  • La suma del tamaño de las entradas de índice compuesto de un documento
  • Tamaño máximo de un valor de campo indexado

    1500 bytes

    Los valores de campo de más de 1500 bytes se truncan. Las consultas que implican valores de campo truncados pueden devolver resultados incoherentes.

    Mejores prácticas de indexación

    Para la mayoría de las aplicaciones, puede confiar en la indexación automática y los enlaces de mensajes de error para administrar sus índices. Sin embargo, es posible que desee agregar exenciones de un solo campo en los siguientes casos:

    Caso Descripción
    Grandes campos de cadenas

    Si tiene un campo de cadena que a menudo contiene valores de cadena largos que no usa para realizar consultas, puede reducir los costos de almacenamiento eximiendo el campo de la indexación.

    Altas tasas de escritura en una colección que contiene documentos con valores secuenciales

    Si indexa un campo que aumenta o disminuye secuencialmente entre los documentos de una colección, como una marca de tiempo, la velocidad máxima de escritura en la colección es de 500 escrituras por segundo. Si no consulta en función del campo con valores secuenciales, puede eximir el campo de la indexación para evitar este límite.

    En un caso de uso de IoT con una alta tasa de escritura, por ejemplo, una colección que contiene documentos con un campo de marca de tiempo podría acercarse al límite de 500 escrituras por segundo.

    campos TTL

    Si usa políticas TTL (tiempo de vida) , tenga en cuenta que el campo TTL debe ser una marca de tiempo. La indexación en campos TTL está habilitada de forma predeterminada y puede afectar el rendimiento a tasas de tráfico más altas. Como práctica recomendada, agregue exenciones de un solo campo para sus campos TTL.

    Gran matriz o campos de mapa

    Los campos de matriz o mapa grandes pueden acercarse al límite de 40.000 entradas de índice por documento. Si no está consultando en función de una matriz grande o un campo de mapa, debe eximirlo de la indexación.