Mejores prácticas de rendimiento: indexación

Mat Keep and Henrik Ingo

Bienvenido al tercero de nuestra serie de publicaciones de blog que cubren las mejores prácticas de rendimiento para MongoDB.

En esta serie, cubrimos consideraciones clave para lograr un rendimiento a escala en una serie de dimensiones importantes, que incluyen:

Habiendo trabajado ambos para un par de proveedores de bases de datos diferentes durante los últimos 15 años, podemos decir con seguridad que no definir los índices apropiados es el problema de rendimiento número uno que los equipos de soporte técnico deben abordar con los usuarios.

Así que tenemos que hacerlo bien... aquí están las mejores prácticas para ayudarle.

Índices en MongoDB

En cualquier base de datos, los índices apoyan la ejecución eficiente de consultas. Sin ellos, la base de datos debe escanear cada documento de una colección o tabla para seleccionar aquellos que coincidan con la declaración de la consulta. Si existe un índice apropiado para una consulta, la base de datos puede utilizar el índice para limitar la cantidad de documentos que debe inspeccionar.

MongoDB ofrece una amplia gama de tipos de índices y funciones con criterios de clasificación específicos del idioma para admitir patrones de acceso complejos a sus datos. Los índices de MongoDB se pueden crear y eliminar según demanda para adaptarse a los requisitos de aplicación y patrones de consulta en evolución, y se pueden declarar en cualquier campo dentro de sus documentos, incluidos los campos anidados dentro de matrices.

Entonces, veamos cómo aprovechar al máximo los índices en MongoDB.

Utilice índices compuestos

Los índices compuestos son índices compuestos por varios campos diferentes. Por ejemplo, en lugar de tener un índice en "Apellido" y otro en "Nombre", normalmente es más eficaz crear un índice que incluya tanto "Apellido" como "Nombre" si consulta ambos nombres. . Nuestro índice compuesto aún se puede utilizar para filtrar consultas que especifican solo el apellido.

Siga la regla ESR

Para índices compuestos, esta regla general resulta útil para decidir el orden de los campos en el índice:

  • Primero, agregue los campos en los que se ejecutan las consultas de igualdad.

  • Los siguientes campos a indexar deben reflejar el orden de clasificación de la consulta.

  • Los últimos campos representan el rango de datos a los que se accederá.

Utilice consultas cubiertas cuando sea posible

Las consultas cubiertas devuelven resultados de un índice directamente sin tener que acceder a los documentos fuente y, por lo tanto, son muy eficientes.

Para que se cubra una consulta, todos los campos necesarios para filtrar, ordenar y/​o devolver al cliente deben estar presentes en un índice. Para determinar si una consulta es una consulta cubierta, utilice el método explain(). Si la salida de explain() muestra totalDocsExamined como 0, esto muestra que la consulta está cubierta por un índice. Lea más en la documentación para explicar los resultados.

Un problema común al intentar lograr consultas cubiertas es que el campo _id siempre se devuelve de forma predeterminada. Debe excluirlo explícitamente de los resultados de la consulta o agregarlo al índice.

En los clústeres fragmentados, MongoDB necesita acceder internamente a los campos de la clave del fragmento. Esto significa que las consultas cubiertas solo son posibles cuando la clave de fragmento es parte del índice. Generalmente es una buena idea hacer esto de todos modos.

Tenga precaución al considerar índices en campos de baja cardinalidad

Las consultas sobre campos con una pequeña cantidad de valores únicos (baja cardinalidad) pueden devolver grandes conjuntos de resultados. Los índices compuestos pueden incluir campos con baja cardinalidad, pero el valor de los campos combinados debe exhibir una alta cardinalidad.

Eliminar índices innecesarios

Los índices consumen muchos recursos: incluso con compresión en el motor de almacenamiento MongoDB WiredTiger, consumen RAM y disco. A medida que se actualizan los campos, se deben mantener los índices asociados, lo que genera una sobrecarga adicional de CPU y E/​S de disco.

MongoDB proporciona herramientas para ayudarle a comprender el uso del índice, que cubriremos más adelante en esta publicación.

Los índices comodín no reemplazan la planificación de índices basada en cargas de trabajo

Para cargas de trabajo con muchos patrones de consulta ad hoc o que manejan estructuras de documentos altamente polimórficas, los índices comodín le brindan mucha flexibilidad adicional. Puede definir un filtro que indexe automáticamente todos los campos, subdocumentos y matrices coincidentes en una colección.

Como ocurre con cualquier índice, también deben almacenarse y mantenerse, por lo que agregarán gastos generales a la base de datos. Si los patrones de consulta de su aplicación se conocen de antemano, entonces debe utilizar índices más selectivos en los campos específicos a los que acceden las consultas.

Utilice la búsqueda de texto para hacer coincidir palabras dentro de un campo

Los índices regulares son útiles para hacer coincidir el valor completo de un campo. Si solo desea hacer coincidir una palabra específica en un campo con mucho texto, utilice un índice de texto.

Si está ejecutando MongoDB en el servicio Atlas, considere utilizar Atlas Full Text Search, que proporciona un índice de Lucene totalmente administrado e integrado con la base de datos MongoDB. FTS proporciona mayor rendimiento y mayor flexibilidad para filtrar, clasificar y clasificar su base de datos para mostrar rápidamente los resultados más relevantes a sus usuarios.

Usar índices parciales

Reduzca el tamaño y la sobrecarga de rendimiento de los índices incluyendo únicamente los documentos a los que se accederá a través del índice. Por ejemplo, cree un índice parcial en el campo ID de pedido que solo incluya documentos de pedido con un estado de pedido de "En curso" o solo indexe el campo dirección de correo electrónico para los documentos donde exista.

Aproveche los índices de claves múltiples para consultar matrices

Si sus patrones de consulta requieren acceder a elementos de matriz individuales, utilice un índice de claves múltiples. MongoDB crea una clave de índice para cada elemento de la matriz y se puede construir sobre matrices que contienen valores escalares y documentos anidados.

Evite expresiones regulares que no queden ancladas ni enraizadas

Los índices están ordenados por valor. Los comodines iniciales son ineficaces y pueden dar lugar a exploraciones de índice completo. Los comodines finales pueden ser eficaces si hay suficientes caracteres iniciales que distinguen entre mayúsculas y minúsculas en la expresión.

Evite las expresiones regulares que no distinguen entre mayúsculas y minúsculas

Si la única razón para usar una expresión regular es que no distingue entre mayúsculas y minúsculas, use un índice que no distinga entre mayúsculas y minúsculas, ya que son más rápidos.

Utilice las optimizaciones de índice disponibles en el motor de almacenamiento WiredTiger

Si administra MongoDB usted mismo, puede opcionalmente colocar índices en su propio volumen separado, lo que permite una paginación del disco más rápida y una menor contención. Consulte las opciones de WiredTiger para obtener más información.

Utilice el plan explicativo

Cubrimos el uso del plan de explicación de MongoDB en la publicación anterior sobre patrones de consulta y creación de perfiles, y esta es la mejor herramienta para verificar la cobertura del índice para consultas individuales.

Trabajando desde el plan de explicación, MongoDB proporciona herramientas de visualización para ayudar a mejorar aún más la comprensión de sus índices y proporciona recomendaciones inteligentes y automáticas sobre qué índices agregar.

Visualice la cobertura del índice con MongoDB Compass y Atlas Data Explorer

Como GUI gratuita para MongoDB, Compass proporciona muchas funciones para ayudarle a optimizar el rendimiento de las consultas, incluida la exploración de su esquema y la visualización de planes de explicación de consultas, dos áreas tratadas anteriormente en esta serie.

La pestaña de índices en Compass agrega otra herramienta a tu arsenal. Enumera los índices existentes para una colección, informando el nombre y las claves del índice, junto con su tipo, tamaño y cualquier propiedad especial. A través de la pestaña de índice también puede agregar y eliminar índices según sea necesario.

Managing indexes with MongoDB Compass

Una característica realmente útil es el uso del índice, que muestra con qué frecuencia se ha utilizado un índice. Tener demasiados índices puede ser casi tan perjudicial para el rendimiento como tener muy pocos, por lo que esta característica es especialmente valiosa para ayudarle a identificar y eliminar índices que no se están utilizando. Esto le ayuda a liberar espacio en el conjunto de trabajo y elimina la sobrecarga de la base de datos que se produce al mantener el índice.

Si está ejecutando MongoDB en nuestro servicio Atlas totalmente administrado, la vista de índices en el Explorador de datos le brindará la misma funcionalidad que Compass, sin que tenga que conectarse a su base de datos con una herramienta separada.

También puede recuperar estadísticas de índice utilizando la etapa de canalización de agregación $indexStats.

Recomendaciones de índices automatizados

Incluso con toda la telemetría proporcionada por las herramientas de MongoDB, usted sigue siendo responsable de extraer y analizar los datos necesarios para tomar decisiones sobre qué índices agregar.

El umbral para consultas lentas varía según el tiempo promedio de operaciones en su clúster para brindar recomendaciones pertinentes a su carga de trabajo.

Los índices recomendados van acompañados de consultas de muestra, agrupadas por forma de consulta (es decir, consultas con una estructura de predicados, clasificación y proyección similares), que se ejecutaron en una colección que se beneficiaría de la adición de un índice sugerido. El Performance Advisor no afecta negativamente el rendimiento de sus clústeres Atlas.

Si está satisfecho con la recomendación, puede implementar los nuevos índices automáticamente, sin incurrir en ningún tiempo de inactividad de la aplicación.

Que sigue

Con esto concluye esta última entrega de la serie de mejores prácticas de rendimiento. La Universidad MongoDB ofrece un curso de capacitación gratuito basado en la web sobre el rendimiento de MongoDB. Esta es una excelente manera de aprender más sobre el poder de la indexación.