Saltar al contenido

Pedir solo lo que hace falta

SQL · Unidad 15: Índices y rendimiento

Antes de reponer un producto agotado, el dueño mira qué días se pidió. La pantalla que se lo enseña pinta solo fechas, y quien la programó escribió SELECT *, por costumbre. ¿Qué cuesta pedir las cinco columnas de cada pedido para pintar una?

Con un índice sobre (producto_id, fecha), la fecha de cada pedido del Cable ya está en el índice. Si la consulta pide solo fecha, la base contesta con él y no abre la tabla. El plan lo dice con una palabra más, COVERING: el índice cubre lo pedido.

Con SELECT *, por cada entrada del índice va además a la tabla, por columnas que nadie va a mirar.

CREATE INDEX idx_pedidos_producto_fecha
ON pedidos (producto_id, fecha);
EXPLAIN QUERY PLAN
SELECT fecha
FROM pedidos
WHERE producto_id = 4;

Devuelve

detail
SEARCH pedidos USING COVERING INDEX idx_pedidos_producto_fecha (producto_id=?)

El resto de la explicación está en la lección, que es del plan completo.

Ejercicios de esta lección

Se hacen en la app, que los corrige al momento y explica por qué.

  1. 1. Completa el código

    Con ese mismo índice, y ahora para el Ratón, el producto 2. Completa para que el plan diga COVERING, porque a la base le alcanza con el índice.

  2. 2. Predice la salida

    ¿Cuándo se pidió el Cable por última vez? Con el índice de dos columnas ya creado, ¿qué plan sale?

  3. 3. Completa el código

    Completa con la única de estas condiciones que la base no puede comprobar antes de agrupar, y que por eso la obliga a pasar por los pedidos de todos los clientes.

  4. 4. Completa el código

    Un reporte corto: cuántas unidades ha pedido cada cliente desde el día 12. pedidos ya tiene un índice sobre fecha. Completa con la condición que deja a la base entrar por ese índice, sin leer los pedidos de antes.

  5. 5. Predice la salida

    Un arreglo deja la consulta como está y le crea a la de adentro un índice sobre pedidos (cliente_id). ¿Qué plan sale?

  6. 6. Encuentra el caso que falla

    Alguien se queda con ese JOIN y su GROUP BY para un reporte. El reporte es de los clientes menores de 30 años, que hoy son Luis, Mateo y Diego: cada uno con cuántos pedidos ha hecho, y un 0 para quien no tenga ninguno. ¿Con cuál de estos cambios la versión nueva deja de dar lo mismo que la subconsulta?

  7. 7. Encuentra el bug

    La pantalla 2 de la lista de pedidos terminó en el pedido 6. La pantalla 3 debería enseñar los pedidos 7, 8 y 9, y enseña el 6 otra vez. ¿Qué línea tiene el problema?

  8. 8. Escribe el código

    La lista también se enseña del pedido más nuevo al más viejo, de 3 en 3. La pantalla anterior terminó en el pedido 10. Escribe la consulta de la pantalla siguiente sin OFFSET: el id y la fecha, en ese orden, de los tres pedidos anteriores al 10, del más nuevo al más viejo.

Hacer esta lección

Se abre en el navegador. Esta lección es del plan completo; la primera unidad de cada curso es gratis.

Ver todas las lecciones →