Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Administración de índices en Amazon DocumentDB con Java
Los índices permiten una recuperación eficaz de los datos de una colección de Amazon DocumentDB. Sin índices, DocumentDB debe digitalizar todos los documentos de la colección para obtener resultados que satisfagan una consulta determinada. En este tema se proporciona información sobre cómo crear, eliminar y enumerar índices mediante los controladores Java de MongoDB. También se explica cómo determinar si se está utilizando un índice concreto en la consulta y cómo dar sugerencias a Amazon DocumentDB para que utilice un índice específico.
Temas
Amazon DocumentDB admite muchos tipos de índices. Para obtener una descripción general completa de todos los índices compatibles, consulte esta entrada de blog.
Creación de índices con Java
Existen dos mecanismos para crear índices en Amazon DocumentDB mediante controladores Java de MongoDB: runCommand()
mediante el método para un único índice o createIndex()
el método para varios índices. createIndexes()
Uno de los motivos para utilizar los createIndexes()
métodos createIndex()
y es que permite gestionar mejor los errores detectando errores específicos relacionados con la creación del índice. Otra razón para usar estos métodos en lugar runCommand()
es que el controlador Java de MongDB proporciona un amplio conjunto de clases de apoyo para la creación y manipulación de índices. Tenga en cuenta que estas clases auxiliares solo se pueden utilizar cuando utilice los métodos createIndex()
ocreateIndexes()
. Hay tres clases de apoyo:
Indexes
— Esta clase sirve como clase de utilidad y ofrece métodos de fábrica estáticos para crear varios tipos de índices. Simplifica el proceso de creación de definiciones de índices complejas y se suele utilizar junto con otras clases relacionadas con los índices. IndexModel
— Se trata de una clase fundamental que resume tanto la definición de las claves de índice como sus opciones. Representa una especificación de índice completa, que combina qué indexar (las claves) con cómo indexar (las opciones). Esta clase es particularmente útil cuando se crean varios índices simultáneamente, ya que permite definir un conjunto de especificaciones de índices que se pueden pasar al createIndexes()
método.IndexOptions
— Se trata de una clase de configuración completa que proporciona un amplio conjunto de métodos para personalizar el comportamiento de los índices. Incluye ajustes para índices únicos, índices dispersos, tiempo de caducidad (TTL) y expresiones de filtrado parcial. Mediante el encadenamiento de métodos, puede configurar varias opciones, como la creación de índices en segundo plano y las restricciones únicas.
Cree un índice único
En este ejemplo se muestra cómo crear un índice único mediante el método createIndex(
() en segundo plano. Para entender la creación de índices en segundo plano y en primer plano, consulteTipos de creación de índices. El siguiente ejemplo de código se utiliza IndexOptions
IndexOptions
al método. createIndex()
collection.createIndex( Indexes.ascending("restaurantId"), new IndexOptions() .unique(true) .name("unique_restaurantId_idx") .background(true));
Cree varios índices
En este ejemplo, se crean varios índices mediante el createIndexes()
método. Primero crea la opción para cada índice mediante el IndexModel
IndexModel
objetos al createIndexes()
método. En el siguiente ejemplo de código se muestra cómo crear un índice compuesto mediante la clase de Indexes
listIndexes()
// Single Field Index on cuisine IndexModel singleIndex = new IndexModel( Indexes.ascending("cuisine"), new IndexOptions().name("cuisine_idx")); // Compound Index IndexModel compoundIndex = new IndexModel( Indexes.compoundIndex( Indexes.ascending("address.state"), Indexes.ascending("priceRange")), new IndexOptions().name("location_price_idx")); // Build a list of IndexModel for the indexes List < IndexModel > indexes = Arrays.asList( singleIndex, compoundIndex ); collection.createIndexes(indexes); // Verify created indexes collection.listIndexes().forEach(index - > System.out.println("Created index: " + index.toJson()));
Cree índices dispersos y parciales
En este ejemplo se muestra la creación de un índice disperso y uno parcial mediante la creación de uno IndexModel
// Sparse Index Model, this will identify only those documents that have a // michelin star rating IndexModel sparseIndex = new IndexModel( Indexes.ascending("michelin.star"), new IndexOptions() .name("michelin_sparse_idx") .sparse(true)); // Partial Index Model where the restaurant is active and has a rating of 4 and above IndexModel partialIndex = new IndexModel( Indexes.ascending("rating.average"), new IndexOptions() .name("high_rated_active_idx") .partialFilterExpression( Filters.and( Filters.eq("isActive", true), Filters.gte("rating.average", 4.0))));
Crea un índice de texto
En este ejemplo se muestra cómo crear un índice de texto. Solo se permite un índice de texto en una colección, pero ese índice de texto puede ser un índice compuesto que abarque varios campos. Al utilizar varios campos en el índice de texto, también puede asignar pesos a cada uno de los campos del índice. Amazon DocumentDB no admite los índices de texto de los campos de matriz y, aunque puede utilizar hasta 30 campos en el índice de texto compuesto, solo se puede asignar un peso a tres campos.
IndexModel textIndex = new IndexModel( new Document() .append("name", "text") .append("description", "text") .append("cuisine", "text"), new IndexOptions() .name("restaurant_text_idx") .weights(new Document() .append("name", 10) // Restaurant name gets highest weight .append("description", 5) // Description get medium weight .append("cuisine", 2) // Cuisine type gets low weight )); collection.createIndex(textIndex.getKeys(), textIndex.getOptions());
Cree un índice mediante runCommand()
Amazon DocumentDB admite la creación de índices en paralelo para reducir el tiempo necesario para crearlos. La indexación paralela utiliza varios trabajadores simultáneos. Los trabajadores predeterminados que se utilizan para la creación del índice son dos. Esta entrada de blogcreateIndex()
o createIndexes()
y, por lo tanto, la única forma de especificar los trabajadores es mediante la. runCommand
El siguiente ejemplo de código muestra cómo runCommand
crear un índice que aumente el número de trabajadores a cuatro:
Document command = new Document("createIndexes", "Restaurants") .append("indexes", Arrays.asList( new Document("key", new Document("name", 1)) .append("name", "restaurant_name_idx") .append("workers", 4) // Specify number of workers )); Document commendResult = connectedDB.runCommand(command);
Eliminar índices
El controlador Java de MongoDB proporciona varios métodos para eliminar índices, adaptándose a diferentes escenarios y preferencias. Puede eliminar los índices por nombre, por especificación clave o eliminar todos los índices a la vez. Los métodos dropIndex()
y se dropIndexes()
pueden invocar en un objeto de colección para eliminar un índice. Al descartar un índice por su nombre, debe asegurarse de que usen el nombre de índice correcto, lo que puede no ser siempre intuitivo, especialmente para los índices compuestos o generados automáticamente. Si intenta eliminar un índice inexistente, se obtendrá un. MongoCommandException
default _id
índice no se puede eliminar, ya que garantiza la exclusividad del documento dentro de la colección.
El siguiente ejemplo de código muestra cómo borrar un índice proporcionando el nombre del campo donde se creó el índice o eliminando todos los índices:
String indexName = "unique_restaurantId_idx"; Document keys = new Document("cuisine", 1); // Drop index by name collection.dropIndex(indexName); // Drop index by keys collection.dropIndex(keys); // Drop all indexes collection.dropIndexes();
Al borrar índices con varias claves, asegúrese de que haya un índice compuesto que contenga todas las claves especificadas y de que el orden de las claves sea correcto. El código de ejemplo de creación del índice anterior muestra una clave compuesta sobre «cocina» y características. Si intentas eliminar esa clave compuesta pero el orden no es el que se utilizó para la creación, se produce MongoCommnadException el siguiente error:
Document keys = new Document("features", 1) .append("cuisine", 1); try { // Drop index by keys collection.dropIndex(keys); System.out.println("Successfully dropped index with keys: " + keys.toJson()); } catch (MongoCommandException commErr) { System.out.println("Error dropping index: " + commErr.getErrorMessage()); throw new RuntimeException("MongoCommandException was thrown while dropping index", commErr); }
Se muestra el siguiente error:
Error dropping index: Cannot drop index: index not found.
Tests run: 3, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.819 sec <<< FAILURE!
com.amazon.docdb.guide.DocDBGuideTest.testindexGuide() Time elapsed: 0.817 sec <<< FAILURE!
org.opentest4j.AssertionFailedError: Unexpected exception thrown: java.lang.RuntimeException: MongoCommandException was thrown while dropping index
Determinar la selección del índice y proporcionar una sugerencia sobre el índice
Trabajar con la funcionalidad de explicación de Amazon DocumentDB es fundamental para comprender el rendimiento de las consultas y el uso de los índices. Al ejecutar una consulta, puede añadir el explain()
método para obtener información detallada sobre el plan de consulta, incluidos los índices, si los hubiera, que se están utilizando. El explain()
resultado proporciona información sobre las etapas de ejecución de la consulta, el número de documentos examinados y el tiempo necesario para cada etapa. Esta información es inestimable para identificar si un índice en particular se está utilizando de manera eficaz o si la consulta podría beneficiarse de una estructura de índice diferente.
El explain()
método se puede encadenar con el find()
método. El explain()
método puede utilizar una ExplainVerbosity
explain()
En este momento, DocumentDB solo admite QUERY_PLANNER
los enumeradores EXECUTION_STATS
y. El siguiente ejemplo de código muestra cómo obtener un planificador de consultas para una consulta específica:
// Query we want to analyze Document query = new Document() .append("cuisine", "Thai") .append("rating.average", new Document("$gte", 4.0)); Document allPlansExplain = collection.find(query).explain(ExplainVerbosity.QUERY_PLANNER); System.out.println("All Plans Explain:\n" + allPlansExplain.toJson());
Se devuelve el siguiente documento JSON para el nivel de verbosidad del planificador de consultas:
{
"queryPlanner": {
"plannerVersion": 1,
"namespace": "ProgGuideData.Restaurants",
"winningPlan": {
"stage": "IXSCAN",
"indexName": "cuisine_idx",
"direction": "forward"
}
},
"serverInfo": {
"host": "guidecluster3",
"port": 27017,
"version": "5.0.0"
},
"ok": 1,
"operationTime": {
"$timestamp": {
"t": 1739221668,
"i": 1
}
}
}
Tiene varias opciones para influir u obligar a Amazon DocumentDB a utilizar un índice específico. hintString()
Los métodos hint()
y le permiten anular el comportamiento de selección de índices predeterminado del optimizador de consultas especificando explícitamente qué índice debe usarse para una consulta. Si bien el optimizador de consultas de DocumentDB suele ser una buena opción para la selección de índices, hay situaciones en las que forzar la aprobación de un índice específico hint()
o hintString()
puede resultar beneficioso, como cuando se trata de datos sesgados o se comprueba el rendimiento de un índice.
El siguiente ejemplo de código obliga a usar el índice compuesto «cuisine_features_idx» para la misma consulta que se ejecutó en el código anterior:
// Query we want to analyze Document query = new Document() .append("cuisine", "Thai") .append("rating.average", new Document("$gte", 4.0)); List < Document > queryDocs = new ArrayList < > (); collection.find(query).hintString("cuisine_features_idx").forEach(doc - > queryDocs.add(doc));