0Pricing
PHP Academy · Lección

Optimización de consultas de base de datos

Identifique consultas N+1, añada índices y reduzca el número de consultas.

Optimización de consultas de base de datos es una lección gratuita de PHP Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de PHP Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de PHP Academy incluye 4 lecciones en total.

Identificación de consultas lentas

Active el registro de consultas lentas de MySQL y establezca un umbral. Revise las consultas que tarden más de lo esperado.

# my.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5  # log queries over 500ms

EXPLAIN / EXPLAIN ANALYZE

Utilice EXPLAIN para entender cómo ejecuta MySQL una consulta y si se utilizan índices.

-- Run in MySQL:
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = "pending";
-- Look for: type=ALL (full scan), key=NULL (no index used)

Adición de índices

Los índices aceleran considerablemente las lecturas en columnas filtradas y ordenadas.

-- Add composite index for the query above:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);

// In Laravel migration:
$table->index(["user_id", "status"]);

Problema de consultas N+1

El problema N+1 ejecuta una consulta para obtener una lista y otra consulta por cada elemento para obtener una relación. Corríjalo mediante la carga anticipada.

<?php
// BAD: 1 + N queries
$posts = Post::all();
foreach ($posts as $post) echo $post->author->name;

// GOOD: 2 queries
$posts = Post::with("author")->get();
foreach ($posts as $post) echo $post->author->name;

Selección únicamente de las columnas necesarias

Evite SELECT *: obtenga solo las columnas que necesita para reducir el uso de memoria y la transferencia de datos por la red.

<?php
// Bad:
$users = User::all();

// Good:
$users = User::select("id", "name", "email")->get();

Procesamiento por bloques de conjuntos de datos grandes

Procese los conjuntos de resultados grandes por bloques para evitar agotar la memoria.

<?php
User::chunk(500, function ($users) {
    foreach ($users as $user) {
        // process each user
    }
});

// Or lazy loading (PHP generator):
User::lazy()->each(fn($user) => processUser($user));

Almacenamiento en caché de consultas

Almacene en caché las agregaciones y los informes costosos que no cambien con frecuencia.

<?php
$revenue = Cache::remember("monthly-revenue", 3600, function () {
    return Order::whereMonth("created_at", now()->month)->sum("total");
});

Evitar consultas en bucles

No ejecute nunca consultas dentro de bucles foreach. Recopile primero los identificadores y después obténgalos en una sola consulta.

<?php
// Collect all product IDs:
$ids = array_column($cartItems, "product_id");
// One query:
$products = Product::whereIn("id", $ids)->get()->keyBy("id");

foreach ($cartItems as $item) {
    $product = $products[$item["product_id"]];
}

Agrupación de conexiones de base de datos

PHP-FPM crea una conexión PDO nueva por trabajador. PgBouncer o ProxySQL pueden agrupar las conexiones para evitar sobrecargar la base de datos con el coste de establecer conexiones.

Índices de cobertura

Un índice de cobertura incluye todas las columnas necesarias para satisfacer una consulta. MySQL puede responder a la consulta utilizando únicamente el índice, sin acceder a las filas de la tabla principal.

Resumen

Active los registros de consultas lentas. Utilice EXPLAIN para encontrar índices que falten. Cargue anticipadamente las relaciones. Seleccione solo las columnas necesarias. Procese los conjuntos de datos grandes por bloques. Almacene en caché las agregaciones costosas. Evite las consultas dentro de los bucles.

Comprobación rápida

¿En qué consiste el problema de consultas N+1?

Preguntas frecuentes

¿La lección «Optimización de consultas de base de datos» es gratis?

Sí — el texto completo de «Optimización de consultas de base de datos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de PHP Academy, actualiza a CoddyKit PRO. El curso de PHP Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Optimización de consultas de base de datos»?

Identifique consultas N+1, añada índices y reduzca el número de consultas. Practicas PHP Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar PHP Academy?

No se requiere experiencia previa. PHP Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Optimización de consultas de base de datos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de PHP Academy?

Sí. Cada lección de PHP Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Perfilado de PHP con Xdebug
  2. OPcache: almacenamiento en caché de bytecode
  3. Optimización de consultas de base de datos
  4. Gestión de memoria y consejos de rendimiento
← Volver a PHP Academy