‫Jonas: Bienvenido de nuevo.
‫Así que ahora hablemos
‫un poco sobre el rendimiento de lectura en MongoDB,
‫por qué algo llamado índices es tan importante
‫y cómo podemos crearlos nosotros mismos.
‫Y quiero comenzar esta demostración sobre índices lanzando una
‫consulta simple en todos nuestros recorridos.
‫Así que vengamos aquí para obtener
‫todos los recorridos y
‫también filtraré por un precio inferior a 1,000.
‫Bien y veamos.
‫Sí, obtenemos tres resultados, de acuerdo.
‫Y eso es importante tenerlo en cuenta
‫para lo que les mostraré a continuación, que
‫es que en realidad también podemos obtener un par de estadísticas
‫sobre la consulta en sí.
‫Vayamos aquí básicamente a la función del controlador.
‫Y entonces esto recuerda ahora mismo en la fábrica de manipuladores.
‫Bien, es esto, creo que está en la
‫parte inferior.
‫Sí, es esto, obtenga todas las funciones de
‫fábrica que crearán este controlador que
‫se llama para la consulta que acabamos de realizar.
‫Y aquí en
‫la consulta, ahora agregaré un método de explicación.
‫De acuerdo, después de la consulta, llamaremos a explicar, de acuerdo.
‫Entonces, echemos un vistazo a eso.
‫Y ahora obtenemos un resultado completamente diferente,
‫que son básicamente estas estadísticas.
‫Ahora hay muchas cosas aquí.
‫Pero lo
‫que realmente me interesa son estas estadísticas de ejecución, está bien.
‫Entonces puede ver aquí que la
‫cantidad de documentos que se devolvieron fueron tres.
‫Y ese es exactamente el resultado que obtuvimos antes.
‫Entonces, antes de hacer la explicación correcta.
‫Pero lo que es realmente importante tener en
‫cuenta aquí es
‫que la cantidad de documentos que se examinaron es nueve, está bien.
‫Y esto significa que MongoDB tuvo que
‫examinar, así que básicamente escanear los nueve documentos
‫para encontrar los tres correctos.
‫Entonces, los tres que coinciden con la consulta están bien.
‫Y eso no es eficiente en absoluto, ¿verdad?
‫Ahora, por supuesto, a
‫esta escala con solo nueve documentos, no hay absolutamente ninguna diferencia.
‫Pero si tuviéramos cientos de
‫miles, o incluso millones de documentos
‫aquí, esto afectaría significativamente
‫el rendimiento de lectura de esta consulta.
‫Entonces, nuevamente, no será el caso en esta aplicación, pero
‫podría ser en una aplicación que creará algún día.
‫Entonces, realmente necesitas aprender acerca de los índices.
‫Porque con los
‫índices podremos resolver este problema.
‫Entonces podemos crear índices en campos específicos en una colección.
‫Por ejemplo, Mongo crea automáticamente un índice en
‫el campo ID de forma predeterminada.
‫Y veamos eso en Compass.
‫Por ejemplo, en todos los recorridos, tenemos aquí la pestaña de índices.
‫Así que hasta este punto solo estuvimos aquí
‫en la pestaña
‫de documentos, pero como ves, tenemos muchas cosas diferentes aquí
‫y una de ellas son los índices.
‫Y de nuevo ves que por defecto tenemos un índice de ID.
‫Y este índice de ID es básicamente una lista ordenada
‫de todas las ID que se almacenan en
‫algún lugar fuera de la colección.
‫Y realmente puede ver
‫un tamaño aquí, que tiene 36 kilobytes, este índice está bien.
‫Y este índice es extremadamente útil.
‫Porque cada vez que los
‫documentos son consultados por el ID, MongoDB buscará ese índice ordenado en lugar de
‫buscar en toda la colección y observará
‫todos los documentos uno por uno, lo
‫que por supuesto es mucho más lento.
‫Entonces, nuevamente, sin un índice, Mongo tiene que mirar
‫cada documento uno por uno.
‫Pero con un índice en el campo que estamos
‫consultando, este proceso se vuelve mucho más eficiente.
‫Entonces eso es bastante inteligente, ¿verdad?
‫Y, por supuesto, podemos establecer nuestros propios índices
‫en campos que consultamos con mucha frecuencia.
‫Entonces, hagamos eso con el campo de
‫precio que acabamos de consultar antes
‫porque creo que es uno de los más importantes
‫por los que la gente consultará, de acuerdo.
‫Y así es como funciona.
‫Así que tenemos que ir al modelo de gira a la derecha.
‫Y luego hagámoslo aquí mismo después de esta declaración interna
‫y decimos tourchema. índice bien.
‫Y luego un objeto con el nombre del
‫campo y recuerda cómo dije que
‫íbamos a establecer el índice en el precio y luego uno o menos uno.
‫Y uno significa que estamos clasificando el
‫índice de precios en
‫orden ascendente, mientras que el menos uno significa orden descendente.
‫Y en realidad también hay otros tipos de índices, como
‫para texto o para datos geoespaciales, pero lo
‫veremos un poco más adelante.
‫Bien, guardemos ahora
‫e intentemos nuestra consulta nuevamente.
‫Y de hecho lo haré un par de
‫veces aquí para asegurarme de que el índice esté realmente configurado.
‫Porque a veces no se configura de inmediato.
‫Pero ahora echemos un vistazo aquí.
‫Y así, de hecho, tenemos todavía nuestro número de devueltos en tres, pero
‫esta vez el número de documentos que se
‫examinaron, por lo que se escanearon, también fueron solo tres.
‫Y eso prueba que con
‫este índice, básicamente logramos exactamente lo que queríamos.
‫Entonces, antes teníamos que escanear los nueve documentos y ahora
‫el motor solo necesita escanear los tres documentos que
‫en realidad también se devuelven.
‫Y nuevamente porque sus precios
‫ahora están ordenados en ese índice.
‫Y eso hace que sea mucho más
‫fácil y mucho más rápido para el motor MongoDB encontrarlos.
‫Y esto es, por supuesto, una gran ganancia de rendimiento.
‫Ahora también echemos un vistazo a Compass aquí,
‫y de hecho recarguemos toda la base de datos, y
‫ahora debería estar aquí,
‫pero por alguna razón no lo está.
‫Quizás intentemos recargar los documentos.
‫Quizás aparezca entonces.
‫En realidad no, analicemos también el esquema, y eso es algo
‫de lo que
‫hablaremos un poco más tarde.
‫Pero aún así, como puede ver, solo tenemos estos dos índices.
‫Pero eso no importa en absoluto porque
‫ya sabemos que el índice realmente funciona, ¿no?
‫Por lo tanto,
‫es completamente normal que a veces esto tarde un poco en actualizarse.
‫Ahora, otra cosa que puede notar aquí es
‫cómo este índice de ID
‫del que hablamos anteriormente dice único aquí, está bien.
‫Y tan único es también una propiedad
‫que podemos dar a los índices.
‫Y esta es realmente la
‫razón por la que los ID siempre deben ser únicos.
‫Así que simplemente porque
‫el índice del ID tiene esta propiedad única.
‫Probablemente también hayas notado que hay un índice
‫para el nombre aquí, ¿verdad?
‫Pero en realidad no lo creamos manualmente nosotros mismos, ¿verdad?
‫Entonces, ¿puedes adivinar por qué está aquí?
‫Bueno, es porque en nuestra definición de esquema, configuramos el
‫campo de nombre para que sea único.
‫Entonces, lo que Mongos hace detrás
‫de escena para garantizar la singularidad de este campo
‫es crear un índice único para él, de acuerdo.
‫Y por eso, no solo la identificación,
‫sino también el nombre siempre deben ser únicos.
‫Está bien y esto ya es genial.
‫Entonces, cuando todo lo que hacemos es solo
‫consultar un solo campo, entonces
‫un índice de un solo campo es perfecto
‫porque recuerde que el índice que acabamos
‫de establecer antes se llama índice de un solo campo.
‫No estoy seguro de si lo mencioné en ese entonces, pero creo que lo hice.
‫Pero de todos modos, si a veces consultamos
‫ese campo pero lo combinamos con
‫otro, entonces es
‫más eficiente crear un índice compuesto.
‫Entonces uno con dos campos y no solo uno.
‫Así que creemos una consulta para eso solo para ilustrarlo.
‫Entonces, otro campo que creo que
‫se va a consultar todo el tiempo es el promedio de calificaciones.
‫Entonces, las calificaciones promedio, creo que así se llama, y digamos que
‫queremos mayor o igual que 4. 7 bien.
‫Enviemos esa consulta.
‫Y veamos cuántos resultados obtenemos.
‫¿Donde es eso?
‫Si aqui.
‫Entonces, el número de
‫resultados, entonces el número de documentos que se
‫devuelven, para que coincidan con esta consulta es dos.
‫Pero todavía teníamos que examinar tres documentos.
‫Y nuevamente, a esta escala, por supuesto,
‫eso no hace ninguna diferencia.
‫Pero como comprenderá, esto es solo un ejemplo.
‫Y ahora queremos arreglar la situación también y
‫para eso usaremos un índice compuesto.
‫Así que volvamos aquí.
‫Comenta este.
‫O en realidad, primero duplíquelo y luego comente.
‫Entonces, en realidad, es muy simple.
‫Todo lo que tenemos que hacer es agregar aquí el otro campo.
‫Así que las calificaciones promedian y pongamos este en
‫orden ascendente.
‫O en realidad, ese es el orden descendente.
‫Así que salvemos esto.
‫Regresemos aquí.
‫Y de nuevo, lo haré un par de veces aquí, de acuerdo.
‫Y veamos nuestros resultados.
‫Y ahora obtenemos el resultado que queríamos.
‫Así que solo se escanearon dos
‫documentos para encontrar los dos documentos que estábamos buscando.
‫Perfecto y, de hecho, este índice compuesto que acabamos de
‫crear también funcionará cuando la consulta para solo uno
‫de estos dos campos aquí individualmente, por lo que
‫el precio o las calificaciones promedian.
‫Entonces, cuando creamos un índice compuesto como
‫este, no tenemos que crear también
‫un individuo para cada uno de los campos.
‫Solo quiero ver cómo se ve ahora en Compass.
‫Pero bueno, todavía se ve igual.
‫Pero de nuevo, no es realmente importante.
‫Una cosa que todavía podemos ver aquí
‫y que es bastante
‫interesante es que en realidad el tamaño de estos índices.
‫Entonces, 72 kilobytes es en realidad mucho más grande que
‫el tamaño total de todos los documentos combinados,
‫que son solo 14 kilobytes, ¿verdad?
‫Básicamente, estos índices que creamos para
‫buscar los documentos ocupan mucho más espacio
‫que los propios documentos.
‫Pero nuevamente, eso es solo porque estamos
‫operando a una escala tan pequeña en este ejemplo.
‫Y eso no es realmente relevante, de acuerdo.
‫Pero sigue siendo importante hablar de
‫esto porque en realidad esto me lleva a nuestra siguiente pregunta.
‫Y esa
‫pregunta es, ¿cómo decidimos qué campo realmente necesitamos indexar?
‫¿Y por qué no establecemos índices en todos los campos?
‫Bueno, usamos la estrategia que usé para
‫establecer los índices en el precio y en la calificación promedio.
‫Entonces, básicamente, necesitamos estudiar cuidadosamente los patrones de acceso
‫de nuestra aplicación para averiguar qué campos
‫son los más consultados y
‫luego establecer los índices para estos campos.
‫Por ejemplo, no estoy configurando un índice aquí sobre el tamaño del
‫grupo porque realmente
‫no creo que muchas personas consulten ese parámetro, por
‫lo que no necesito crear un índice allí.
‫Porque realmente no queremos exagerar con los índices.
‫Por lo tanto, no queremos establecer índices a ciegas en todos los
‫campos y luego esperar lo mejor básicamente.
‫Y la razón
‫de esto es que cada índice realmente usa
‫recursos, como puede ver aquí a la derecha.
‫Además, cada índice debe actualizarse cada vez que
‫se actualiza la colección subyacente.
‫Entonces, si tiene una colección con una alta proporción de escritura y lectura,
‫por lo tanto, una colección en la que
‫se escribe principalmente, entonces no tendría
‫ningún sentido crear un índice en cualquier campo de esta colección
‫porque el costo de actualizar siempre el índice
‫y mantener en la memoria, claramente supera el beneficio de
‫tener el índice en primer lugar si
‫rara vez tenemos búsquedas, por
‫lo que tenemos consultas, para esa colección.
‫Entonces, en resumen, al decidir si
‫indexar un determinado campo o no,
‫debemos equilibrar la frecuencia
‫de las consultas utilizando ese campo exacto
‫con el costo de mantener este índice, y
‫también con el patrón de lectura y escritura del recurso.
‫Sin embargo, al igual que ocurre con el modelado
‫de datos, aquí no existen reglas estrictas.
‫Así que todo es
‫un poco confuso y realmente necesitas un
‫poco de experimentación y también experiencia para hacerlo bien, de acuerdo.
‫Pero hagas lo que hagas, no ignores la indexación.
‫Porque incluso si no
‫es perfecto, siempre tendrá un gran beneficio para su aplicación.
‫De acuerdo, y eso es todo lo que
‫tenía que contarte sobre los índices.
‫Solo hay un índice más que realmente quiero establecer aquí,
‫que es para el tour slug, está bien.
‫Porque más adelante
‫querremos usar la barra única para consultar recorridos.
‫Lo que significa que la babosa probablemente se
‫convertirá en el campo más consultado.
‫Y por eso tiene
‫todo el sentido tener también un índice para ese.
‫Entonces tourschema. index
‫y slug uno.
‫Y la mayoría de las veces el uno o el menos uno no es tan importante.
‫Bien, ahora tengo mucha curiosidad por intentar
‫ver esto aquí en Compass.
‫Entonces, lo que voy a hacer es intentar conectarme a la base
‫de datos nuevamente aquí.
‫Y entonces puedo obtener eso aquí de los más recientes.
‫Haga clic, conéctese, y luego deberíamos conectarnos a la
‫misma base de datos.
‫Así que natours, tours, vayamos a nuestros índices.
‫Y ahora aquí vamos.
‫Así que ahora tenemos nuestros índices aquí.
‫Entonces, hagamos esta ventana más grande
‫y echemos un vistazo a lo que obtuvimos.
‫Así que aquí tenemos nuestra babosa.
‫Tenemos el precio, que es el primero que establecemos.
‫Y luego también tenemos el precio y las calificaciones promedio,
‫que es compuesto y también ves aquí que
‫este de aquí es ascendente y este es descendente
‫porque tiene el menos uno.
‫Y otra cosa que puede notar es
‫que en realidad
‫ya no tenemos este índice de precios en nuestro código.
‫Pero todavía está aquí.
‫Por lo tanto, no es suficiente eliminar el índice
‫de nuestro código, realmente necesitamos eliminarlo de la base de datos en sí.
‫Así que recuerde que lo teníamos aquí
‫al principio y luego
‫lo comentamos y creamos este nuevo índice
‫compuesto, pero nuevamente el índice está parado aquí.
‫Pero como en realidad
‫ya no lo necesitamos, podemos continuar y eliminarlo correctamente.
‫Ahora tenemos que escribir el nombre solo para asegurarnos
‫de que no cometemos ningún error.
‫Y aquí vamos, genial.
‫Entonces ese es el poder de los índices.
‫Realmente pueden hacer que nuestro rendimiento de
‫lectura en bases de datos sea mucho, mucho mejor.
‫Por tanto, en
‫sus propias aplicaciones, nunca debería ignorarlas.
‫Y antes de terminar, retomemos ese método
‫de explicación que agregamos
‫aquí en nuestra función de controlador.
‫Y de hecho,
‫solo como referencia, lo dejaré aquí así.
‫Dale una oportunidad.
‫Volver al menú de publicaciones.
‫Probemos eso ahora.
‫Y de hecho, ha vuelto a funcionar.
‫Está bien y ahora eso es realmente.