Tarea 2 y 3 · MongoDB con PHP

Grupo 5: Índices y rendimiento en MongoDB

Laboratorio en vivo para demostrar COLLSCAN, IXSCAN, índices simples y compuestos, explain(), rangos, espacio y costo de escrituras.

PHP → MongoDBConectadoPing OK
Base de datosgrupo5_dbBase asignada al grupo
ColecciónproductosGrupo5Escenario: productos
Documentos100.001Volumen para comparar planes
Espacio de datos16,47 MBTamaño lógico de documentos
Espacio de índices2,73 MBCosto adicional de almacenamiento

1 · Administración y visualización

Índices de la colección

MongoDB crea automáticamente _id_. Los demás índices se crean aquí para comparar el plan antes y después.

Índice simple1 campo
colección→categoria ↑
db.productosGrupo5.createIndex({ categoria: 1 })
Índice compuesto2 campos ordenados
categoria ↑→precio ↑
db.productosGrupo5.createIndex({ categoria: 1, precio: 1 })
_id_Índice automático
1Índices simples de la demo
0Índices compuestos de la demo
2,73 MBEspacio total de índices
_id_
Automático
_id ↑
2,18 MB
idx_categoria
Simple
categoria ↑
560,00 KB
NombreCampos y ordenTipoEspacioAcción
_id_ {"_id":1} Automático 2,18 MB Protegido
idx_categoria {"categoria":1} Simple 560,00 KB

2 · Consulta general + explain()

Construya la consulta que quiera analizar

Todos los filtros son opcionales y se combinan. Los rangos usan realmente $gte y $lte. La consulta solo se ejecuta cuando presiona el botón.

Limpiar filtros
Sin índiceElimine los índices y consulte Categoría = Ropa → espere COLLSCAN.
Índice útilCree { categoria: 1 } y repita el mismo filtro → espere IXSCAN.
Orden compuestoCree { categoria: 1, precio: 1 }. Categoría + Precio puede usarlo; solo Precio no tiene el mismo prefijo.
db.productosGrupo5.find({ ...filtros... }).explain("executionStats")
Aún no se ha ejecutado una consulta.Seleccione filtros y presione “Ejecutar y analizar”.

3 · Antes y después

Mismo filtro, distinto plan

La comparación solo es válida cuando el filtro es idéntico. Se guarda un COLLSCAN como “antes” y un IXSCAN posterior como “después”.

Comparación pendiente.Ejecute un filtro sin índice, cree el índice apropiado y repita exactamente el mismo filtro.

4 · INSERT y UPDATE reales desde PHP

Demuestre el costo de mantener índices

En un INSERT deben agregarse entradas a los índices aplicables. En un UPDATE, si cambia un campo indexado, también deben mantenerse sus claves de índice.

INSERTCrear producto
UPDATEModificar campos indexables

Cambiar categoría/precio permite explicar qué índices deben actualizar sus claves.

5 · Conceptos obligatorios

¿Qué es un índice?

Es una estructura auxiliar que MongoDB mantiene para localizar valores sin tener que revisar todos los documentos en cada consulta. _id_ se crea automáticamente.

  • Simple: un solo campo, por ejemplo { categoria: 1 }.
  • Compuesto: varios campos ordenados, por ejemplo { categoria: 1, precio: 1 }.
  • Campos adecuados: usados con frecuencia en filtros/ordenamientos y con selectividad suficiente.
  • Campo poco selectivo: un booleano como activo tiene pocos valores posibles; indexarlo solo no siempre compensa.

Costo y orden

Un índice no es gratuito

  • Ocupa almacenamiento adicional, visible arriba con collStats.
  • INSERT debe agregar entradas a los índices.
  • UPDATE de campos indexados puede modificar entradas existentes.
  • Más índices no significa automáticamente mejor rendimiento.
  • En un compuesto, el orden define el prefijo útil: categoria → precio no equivale a precio → categoria.

6 · Comparación relacional

MongoDB y CREATE INDEX en SQL

MongoDB
db.productosGrupo5.createIndex({ categoria: 1 })
SQL
CREATE INDEX idx_categoria
ON productos(categoria);
AspectoMongoDBBase relacional
ObjetivoReducir trabajo para localizar documentosReducir trabajo para localizar filas
Índice simpleUn campo de documentoUna columna
Índice compuestoVarios campos; el orden importaVarias columnas; el orden también importa
Plan de ejecuciónexplain(), COLLSCAN/IXSCANEXPLAIN; términos exactos dependen del SGBD
CostoEspacio + mantenimiento en escriturasEspacio + mantenimiento en escrituras
Crear índices indiscriminadamenteNo es recomendable: cada índice tiene costo de almacenamiento y mantenimiento; se diseña según patrones reales de consulta.

7 · Verificación con mongosh

Compruebe que los datos son reales

use grupo5_dbdb.productosGrupo5.countDocuments({})
db.productosGrupo5.getIndexes()
db.productosGrupo5.stats()
db.productosGrupo5.findOne({ codigo: "DEMO-..." })

mongosh sirve como verificación; la demostración principal sigue ejecutándose desde PHP.

Pregunta de cierre

¿Por qué mejora consultas y cuesta en otras operaciones?

Porque el índice puede evitar o reducir una exploración de la colección durante una lectura, pero esa estructura adicional ocupa espacio y debe mantenerse cuando se insertan documentos o cambian campos indexados.