Índices

Cada consulta de Google Cloud Datastore calcula los resultados con uno o más índices que contienen claves de entidad en una secuencia especificada por las propiedades del índice y, de forma opcional, las principales de la entidad. Los índices se actualizan a fin de mostrar cualquier cambio que haga la aplicación a sus entidades para que estén disponibles los resultados correctos de todas las consultas sin realizar procesamiento adicional.

Existen dos tipos de índices:

Índices integrados
Según la configuración predeterminada, Cloud Datastore predefine automáticamente un índice para las propiedades de cada categoría de entidad. Estos índices únicos de propiedades son útiles para las consultas simples.
Índices compuestos
Los índices compuestos indexan múltiples valores de propiedad por cada entidad indexada. Los índices compuestos permiten realizar consultas complejas y se definen en un archivo de configuración de índices (index.yaml).

Analizaremos los tipos de índices más adelante.

Para obtener un análisis más profundo de los índices y las consultas, revisa el artículo Selección de índices y búsqueda avanzada.

Definición y estructura de los índices

Un índice se define en una lista de propiedades de una categoría de entidad determinada, con un orden correspondiente (ascendente o descendente) para cada propiedad. El índice también puede incluir las entidades principales de la entidad para usarlas en las consultas principales.

Una tabla de índice contiene una columna por cada propiedad que figura en la definición del índice. Cada fila de la tabla representa una entidad de Cloud Datastore que es un resultado potencial de las consultas basadas en el índice. Una entidad solo se incluye en el índice si tiene un valor indexado configurado para cada propiedad usada en el índice; si la definición del índice hace referencia a una propiedad cuya entidad no tiene ningún valor, esa entidad no aparecerá en el índice y nunca se mostrará como resultado de ninguna búsqueda basada en el índice.

Las filas de una tabla de índice se ordenan primero por entidad principal y luego por valor de las propiedades, en el orden especificado en la definición del índice. El índice perfecto de una consulta, que permite que esta se ejecute de la manera más eficiente, se define según las siguientes propiedades y en este orden:

  1. Propiedades usadas en filtros de igualdad
  2. Propiedad usada en un filtro de desigualdad (no puede haber más de uno)
  3. Propiedades usadas en ordenamientos

Esto garantiza que todos los resultados para cada posible ejecución de la consulta aparezcan en filas consecutivas de la tabla. Cloud Datastore ejecuta una consulta con el índice perfecto mediante estos pasos:

  1. Identifica el índice correspondiente a la categoría, las propiedades de filtro, los operadores de filtro y el ordenamiento de la consulta.
  2. Busca desde el principio del índice hasta la primera entidad que cumple con todas las condiciones de filtro de la consulta.
  3. Continúa la búsqueda del índice y muestra cada entidad hasta que se cumple alguna de las siguientes condiciones:
    • Se encuentra una entidad que no cumple con las condiciones del filtro.
    • Se alcanza el final del índice.
    • Se recopiló la cantidad máxima de resultados solicitados por la consulta.

Por ejemplo, considera la siguiente consulta:

SELECT * FROM Task
WHERE category = 'Personal'
  AND priority < 3
ORDER BY priority DESC

El índice perfecto de esta consulta es una tabla de claves para las entidades de categoría Task, con columnas para los valores de las propiedades category y priority. El índice se ordena primero de forma ascendente por category y luego descendente por priority:

indexes:
- kind: Task
  properties:
  - name: category
    direction: asc
  - name: priority
    direction: desc

Dos consultas de la misma forma, pero con valores diferentes de filtro, usan el mismo índice. Por ejemplo, la siguiente consulta usa el mismo índice que la consulta anterior:

SELECT * FROM Task
WHERE category = 'Work'
  AND priority < 5
ORDER BY priority DESC

Considera este índice:

indexes:
- kind: Task
  properties:
  - name: category
    direction: asc
  - name: priority
    direction: asc
  - name: created
    direction: asc

Las dos consultas siguientes también usan el mismo índice, a pesar de tener formas diferentes:

SELECT * FROM Task
WHERE category = 'Personal'
  AND priority = 5
ORDER BY created ASC

y

SELECT * FROM Task
WHERE category = 'Work'
ORDER BY priority ASC, created ASC

El índice creado con anterioridad puede satisfacer ambas consultas.

Configuración de índices

Cloud Datastore proporciona índices integrados o automáticos para los siguientes tipos de consultas:

  • Consultas sin categoría solo con filtros de entidad principal y de clave
  • Consultas solo con filtros de entidad principal y de igualdad
  • Consultas solo con filtros de desigualdad (limitados a una única propiedad)
  • Consultas solo con filtros de entidad principal, filtros de igualdad en propiedades y filtros de desigualdad en claves
  • Consultas sin filtros y solo con un ordenamiento en una propiedad, ya sea ascendente o descendente

Por ejemplo, según la configuración predeterminada, Cloud Datastore predefine de manera automática dos índices de propiedad única por cada propiedad de cada categoría de entidad, uno en orden ascendente y uno en orden descendente. Si no quieres que Cloud Datastore mantenga un índice para una propiedad, excluye la propiedad de tus índices. Ten en cuenta que si excluyes una propiedad, la quitarás de cualquier índice compuesto.

Los índices integrados permiten realizar muchas consultas sencillas, como consultas de solo igualdad y consultas de desigualdad simples.

Los índices integrados no figuran en la Página de índices de Google Cloud Platform Console.

Para realizar consultas más complejas, una aplicación debe definir índices compuestos o manuales. Los índices compuestos son obligatorios para los siguientes tipos de consultas:

  • Consultas con filtros principales y de desigualdad
  • Consultas con uno o más filtros de desigualdad en una propiedad y uno o más filtros de igualdad en otras propiedades
  • Consultas con un ordenamiento por claves descendente
  • Consultas con varios ordenamientos
  • Consultas con uno o más filtros y uno o más ordenamientos

Los índices compuestos se definen en el archivo de configuración de índices (index.yaml) de la aplicación (el archivo de configuración de índices no contiene los índices integrados).

Los índices compuestos constan de varias propiedades y requieren que cada propiedad individual no esté excluida de los índices.

Los índices compuestos se pueden ver en la Página de índices de GCP Console. No puedes usar GCP Console para crear o actualizar índices compuestos.

Si la aplicación intenta realizar una consulta que no puede ejecutarse con los índices disponibles (ya sean integrados o especificados en el archivo de configuración de índices), la consulta fallará.

La API de Cloud Datastore sugiere automáticamente índices que son adecuados para la mayoría de las aplicaciones. Es posible que tus índices requieran ajustes manuales en función del uso que haga tu aplicación de Cloud Datastore y del tamaño y la forma de tus datos. Por ejemplo, la escritura de entidades con múltiples valores de propiedad puede dar como resultado un índice con alto crecimiento que tiene un costo de almacenamiento elevado.

El emulador de Cloud Datastore puede facilitar la administración de tu archivo de configuración de índices. En lugar de mostrar un error cuando se ejecuta una consulta que requiere un índice y no lo tiene, el emulador de Cloud Datastore puede generar una configuración de índices que permita que la consulta se realice con éxito. Si tus pruebas locales de una aplicación abarcan todas las consultas posibles que puede realizar la aplicación, con todas las combinaciones de filtro y ordenamiento, las entradas generadas representarán un conjunto completo de índices. Si tus pruebas no abarcan todas las formas de consultas posibles, puedes revisar y ajustar el archivo de configuración de índices antes de actualizarlos.

Para obtener más información sobre index.yaml, visita Configuración de índices.

Implementa o borra índices

Cuando termines de modificar tu archivo de configuración de índices, ejecuta el comando gcloud datastore create-indexes para poner los índices en servicio. Para obtener más información, consulta Actualiza los índices.

Si antes implementaste índices que ya no necesitas, puedes borrar los índices sin utilizar.

Índices y propiedades

Estas son algunas consideraciones especiales sobre los índices y cómo se relacionan con las propiedades de las entidades de Cloud Datastore:

Propiedades con tipos de valores mixtos

Cuando dos entidades tienen propiedades con el mismo nombre, pero diferentes tipos de valor, un índice de la propiedad clasifica las entidades primero por tipo de valor y luego por un orden secundario apropiado para cada tipo. Por ejemplo, si dos entidades tienen una propiedad llamada age, una con un valor entero y la otra con un valor string, la entidad con el valor de número entero siempre precede a la que tiene el valor string cuando se las ordena por la propiedad age, sin importar el valor mismo de las propiedades.

Esto es muy importante en el caso de los números enteros y los de coma flotante, que Cloud Datastore trata como tipos separados. Dado que todos los números enteros se ordenan antes que los números flotantes, una propiedad con el valor de número entero 38 aparece antes que una con el valor de número flotante 37.5.

Propiedades excluidas

Si sabes que nunca tendrás que ordenar o filtrar una propiedad en particular, puedes excluirla de los índices para que Cloud Datastore no mantenga las entradas de índice de esa propiedad. Esto reduce el costo de ejecutar tu aplicación, ya que disminuye el espacio de almacenamiento necesario para las entradas de índice. Una entidad con una propiedad excluida se comporta como si la propiedad no estuviera configurada: las consultas con un filtro o un orden de clasificación en la propiedad excluida nunca mostrarán esa entidad.

La propiedad description del siguiente ejemplo está excluida de los índices:

C#

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para C#.

Entity task = new Entity()
{
    Key = _db.CreateKeyFactory("Task").CreateKey("sampleTask"),
    ["category"] = "Personal",
    ["created"] = new DateTime(1999, 01, 01, 0, 0, 0, DateTimeKind.Utc),
    ["done"] = false,
    ["priority"] = 4,
    ["percent_complete"] = 10.0,
    ["description"] = new Value()
    {
        StringValue = "Learn Cloud Datastore",
        ExcludeFromIndexes = true
    },
};

Go

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Go.

type Task struct {
	Category        string
	Done            bool
	Priority        int
	Description     string `datastore:",noindex"`
	PercentComplete float64
	Created         time.Time
}
task := &Task{
	Category:        "Personal",
	Done:            false,
	Priority:        4,
	Description:     "Learn Cloud Datastore",
	PercentComplete: 10.0,
	Created:         time.Now(),
}

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Java.

Entity task = Entity.newBuilder(taskKey)
    .set("category", "Personal")
    .set("created", Timestamp.now())
    .set("done", false)
    .set("priority", 4)
    .set("percent_complete", 10.0)
    .set("description",
      StringValue.newBuilder("Learn Cloud Datastore").setExcludeFromIndexes(true).build())
    .build();

Node.js

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Node.js.

const task = [
  {
    name: 'category',
    value: 'Personal',
  },
  {
    name: 'created',
    value: new Date(),
  },
  {
    name: 'done',
    value: false,
  },
  {
    name: 'priority',
    value: 4,
  },
  {
    name: 'percent_complete',
    value: 10.0,
  },
  {
    name: 'description',
    value: 'Learn Cloud Datastore',
    excludeFromIndexes: true,
  },
];

PHP

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para PHP.

$task = $datastore->entity(
    $key,
    [
        'category' => 'Personal',
        'created' => new DateTime(),
        'done' => false,
        'priority' => 4,
        'percent_complete' => 10.0,
        'description' => 'Learn Cloud Datastore'
    ],
    ['excludeFromIndexes' => ['description']]
);

Python

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Python.

task = datastore.Entity(
    key,
    exclude_from_indexes=['description'])
task.update({
    'category': 'Personal',
    'description': 'Learn Cloud Datastore',
    'created': datetime.datetime.utcnow(),
    'done': False,
    'priority': 4,
    'percent_complete': 10.5,
})

Ruby

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Ruby.

task = datastore.entity "Task" do |t|
  t["category"] = "Personal"
  t["created"] = Time.now
  t["done"] = false
  t["priority"] = 4
  t["percent_complete"] = 10.0
  t["description"] = "Learn Cloud Datastore"
  t.exclude_from_indexes! "description", true
end

GQL

No aplicable

La consulta del siguiente ejemplo no mostrará ningún resultado si se excluyó la propiedad description:

C#

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para C#.

Query query = new Query("Task")
{
    Filter = Filter.Equal("description", "Learn Cloud Datastore")
};

Go

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Go.

query := datastore.NewQuery("Tasks").Filter("Description =", "A task description")

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Java.

Query<Entity> query = Query.newEntityQueryBuilder()
    .setKind("Task")
    .setFilter(PropertyFilter.eq("description", "A task description"))
    .build();

Node.js

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Node.js.

const query = datastore
  .createQuery('Task')
  .filter('description', '=', 'A task description.');

PHP

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para PHP.

$query = $datastore->query()
    ->kind('Task')
    ->filter('description', '=', 'A task description.');

Python

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Python.

query = client.query(kind='Task')
query.add_filter('description', '=', 'Learn Cloud Datastore')

Ruby

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Ruby.

query = datastore.query("Task").
        where("description", "=", "A task description.")

GQL


# Will not return any results!
SELECT * FROM Task WHERE description = 'A task description.'

Más adelante, puedes volver a indexar la propiedad.

Sin embargo, ten en cuenta que cambiar una propiedad de excluida a indexada no afecta a ninguna entidad existente que se haya creado antes del cambio. Las consultas que filtren según la propiedad no mostrarán esas entidades existentes, ya que las entidades no estaban escritas en el índice de la consulta cuando se crearon. Para que las consultas futuras puedan acceder a las entidades, debes volver a escribirlas en Cloud Datastore para que se ingresen en los índices apropiados. Es decir, debes hacer lo siguiente para cada una de esas entidades:

  1. Busca (get) la entidad en Cloud Datastore.
  2. Ingresa (put) la entidad de nuevo en Cloud Datastore.

De manera similar, cambiar una propiedad de indexada a excluida solo afecta a las entidades escritas posteriormente en Cloud Datastore. Las entradas de índice de cualquier entidad actual con esa propiedad existirán hasta que se actualicen o borren las entidades. Para evitar resultados no deseados, debes quitar todas las consultas de tu código que filtran o clasifican según la propiedad (ahora excluida).

Límites de índice

Cloud Datastore impone límites al número y tamaño general de las entradas de índice que se pueden asociar con una sola entidad. Estos límites son grandes, y la mayoría de las aplicaciones no se ven afectadas. Sin embargo, hay circunstancias en las que puedes encontrarte con estos límites.

Como se describió anteriormente, Cloud Datastore crea una entrada en un índice predefinido para cada propiedad de cada entidad excepto las que hayas declarado explícitamente como excluidas de tus índices. La propiedad también puede estar incluida en índices personalizados adicionales declarados en tu archivo de configuración de índices (index.yaml). Siempre que una entidad no tenga propiedades de lista, tendrá a lo sumo una entrada en cada uno de estos índices personalizados (para índices no principales) o uno para cada una de las entidades principales de la entidad (para índices principales). Cada una de estas entradas de índice debe actualizarse cada vez que cambie el valor de la propiedad.

En el caso de una propiedad que tiene un valor único para cada entidad, cada valor posible debe almacenarse solo una vez por entidad en el índice predefinido de la propiedad. Pese a ello, es posible que una entidad con un gran número de estas propiedades de valor único supere el límite de entradas o de tamaño del índice. De manera similar, una entidad que puede tener múltiples valores para la misma propiedad requiere una entrada de índice distinta para cada valor. De la misma forma, si el número de valores posibles es grande, esta entidad puede superar el límite de entradas.

La situación empeora en el caso de las entidades con varias propiedades, cada una de las cuales puede asumir diversos valores. A fin de alojar una entidad de ese tipo, el índice debe incluir una entrada para cada combinación posible de valores de propiedad. Los índices personalizados que hacen referencia a varias propiedades, cada una con múltiples valores, son susceptibles a una “explosión” combinatoria y pueden requerir un gran número de entradas para una entidad con una cantidad relativamente pequeña de valores de propiedad posibles. Estos índices con alto crecimiento pueden aumentar en gran medida el tamaño de almacenamiento de una entidad en Cloud Datastore debido la cantidad alta de entradas de índice que deben almacenarse. Los índices con alto crecimiento a menudo también pueden causar que la entidad supere los límites de cantidad de entradas o de tamaño.

Considera el siguiente código:

C#

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para C#.

Entity task = new Entity()
{
    Key = _db.CreateKeyFactory("Task").CreateKey("sampleTask"),
    ["tags"] = new ArrayValue() { Values = { "fun", "programming", "learn" } },
    ["collaborators"] = new ArrayValue() { Values = { "alice", "bob", "charlie" } },
    ["created"] = DateTime.UtcNow
};

Go

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Go.

task := &Task{
	Tags:          []string{"fun", "programming", "learn"},
	Collaborators: []string{"alice", "bob", "charlie"},
	Created:       time.Now(),
}

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Java.

Entity task = Entity.newBuilder(taskKey)
    .set("tags", "fun", "programming", "learn")
    .set("collaborators", "alice", "bob", "charlie")
    .set("created", Timestamp.now())
    .build();

Node.js

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Node.js.

const task = {
  method: 'insert',
  key: datastore.key('Task'),
  data: {
    tags: ['fun', 'programming', 'learn'],
    collaborators: ['alice', 'bob', 'charlie'],
    created: new Date(),
  },
};

PHP

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para PHP.

$task = $datastore->entity(
    $datastore->key('Task'),
    [
        'tags' => ['fun', 'programming', 'learn'],
        'collaborators' => ['alice', 'bob', 'charlie'],
        'created' => new DateTime(),
    ]
);

Python

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Python.

task = datastore.Entity(client.key('Task'))
task.update({
    'tags': [
        'fun',
        'programming',
        'learn'
    ],
    'collaborators': [
        'alice',
        'bob',
        'charlie'
    ],
    'created': datetime.datetime.utcnow()
})

Ruby

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Cloud Datastore, consulta las bibliotecas cliente de Cloud Datastore. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud Datastore para Ruby.

task = datastore.entity "Task" do |t|
  t["tags"] = ["fun", "programming", "learn"]
  t["collaborators"] = ["alice", "bob", "charlie"]
  t["created"] = Time.now
end

GQL

No aplicable

Crea una entidad Task con tres valores para la propiedad tags y tres para la propiedad collaborators, y configura created como la fecha actual. Esto requerirá 9 entradas de índice, una para cada combinación posible de valores de propiedad:

('fun', 'alice', NOW())
('fun', 'bob', NOW())
('fun', 'charlie', NOW())

('programming', 'alice', NOW())
('programming', 'bob', NOW())
('programming', 'charlie', NOW())

('learn', 'alice', NOW())
('learn', 'bob', NOW())
('learn', 'charlie', NOW())

Cuando la misma propiedad se repite varias veces, Cloud Datastore puede detectar índices con alto crecimiento y sugerir un índice alternativo. Sin embargo, en todas las demás circunstancias (como la consulta definida en este ejemplo), Cloud Datastore generará un índice con alto crecimiento. En este caso, puedes evitar el índice con alto crecimiento si configuras de forma manual un índice en tu archivo de configuración de índices:

indexes:
- kind: Task
  properties:
  - name: tags
  - name: created
- kind: Task
  properties:
  - name: collaborators
  - name: created

Esto reduce el número de entradas necesarias a (|tags| *|created| + |collaborators| * |created|), o 6 entradas en lugar de 9:

('fun', NOW())
('programming', NOW())
('learn', NOW())

('alice', NOW())
('bob', NOW())
('charlie', NOW())

Fallarán todas las operaciones commit que hagan que un índice supere los límites de entradas o de tamaño. En el texto del error, se describe qué límite se superó ("Too many indexed properties" o "Index entries too large") y qué índice personalizado fue la causa. Si creas un índice nuevo que podría superar los límites de cualquier entidad, las consultas sobre ese índice fallarán y el índice aparecerá con el estado Error en GCP Console. Para manejar estos índices de Error, realiza lo siguiente:

  1. Quita el índice de tu archivo de configuración de índices (index.yaml).
  2. Limpia el índice con la herramienta de línea de comandos de gcloud y con la opción vacuum_indexes, como se describe en Borra índices sin utilizar.
  3. Realiza una de las siguientes acciones:
    • Reformula la definición del índice y las consultas correspondientes.
    • Quita las entidades que generan la explosión del índice.
  4. Agrega el índice de nuevo a index.yaml.
  5. Actualiza el índice con la herramienta de línea de comandos de gcloud y con la opción update_indexes, como se describe en Actualiza índices.

Puedes evitar los índices con alto crecimiento si evitas las consultas que requieren un índice personalizado con una propiedad de lista. Como se describió antes, esto incluye consultas con varios ordenamientos o con una mezcla de filtros de igualdad y desigualdad.

Índices para proyecciones

Las consultas de proyección requieren que todas las propiedades especificadas en la proyección se incluyan en un índice de Cloud Datastore. El emulador de Cloud Datastore genera de manera automática los índices que necesitas en el archivo de configuración de índices, index.yaml, que se sube junto con tu aplicación.

Una forma de minimizar el número de índices requeridos es proyectar las mismas propiedades de manera coherente, incluso cuando no todas sean necesarias siempre. Por ejemplo, estas consultas requieren dos índices separados:

SELECT priority, percent_complete FROM Task

SELECT priority, percent_complete, created FROM Task

Sin embargo, si siempre proyectas las propiedades priority, percent_complete, created, incluso cuando created no es necesaria, solo se necesitará un índice.

Convertir una consulta existente en una consulta de proyección puede requerir la creación de un índice nuevo si las propiedades de la proyección no están incluidas en otra parte de la consulta. Por ejemplo, supongamos que tienes una consulta existente como esta:

SELECT * FROM Task
WHERE priority > 1
ORDER BY priority, percent_complete

que requiere el índice:

indexes:
- kind: Task
  properties:
  - name: priority
  - name: percent_complete

Convertir esto en cualquiera de estas consultas de proyección

SELECT created FROM Task
WHERE priority > 1
ORDER BY priority, percent_complete

SELECT priority, percent_complete, created FROM Task
WHERE priority > 1
ORDER BY priority, percent_complete

ingresa una nueva propiedad (created) y, por lo tanto, requerirá la creación de un nuevo índice:

indexes:
- kind: Task
  properties:
  - name: priority
  - name: percent_complete
  - name: created

Sin embargo,

SELECT priority, percent_complete FROM Task
WHERE priority > 1
ORDER BY priority, percent_complete

no cambiaría el índice requerido, porque las propiedades proyectadas priority y percent_complete ya se incluyeron en la consulta existente.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Documentación de Cloud Datastore