Tema 24 · ÍNDICES & SEGURIDAD

Índices (INDEX), EXPLAIN y Buenas Prácticas

Optimiza el rendimiento de tus bases de datos mediante índices (B-Tree), diagnostica planes de ejecución con EXPLAIN y blinda tus sistemas contra inyecciones SQL mediante consultas preparadas.

¿Cómo Funcionan los Índices en Bases de Datos?

Un índice es una estructura de datos especializada (generalmente un árbol B-Tree) que el motor de base de datos mantiene para localizar registros a gran velocidad sin necesidad de escanear la tabla completa (Full Table Scan).

Imagina un libro de 1,000 páginas: sin índice alfabético al final, tendrías que leer cada página para encontrar un tema. Con el índice, vas directamente a la página exacta en microsegundos.

-- Crear un índice sobre la columna email para búsquedas instantáneas
CREATE INDEX idx_estudiantes_email ON estudiantes(email);

-- Crear un índice compuesto para consultas combinadas
CREATE INDEX idx_inscripciones_est_cur ON inscripciones(estudiante_id, curso_id);

⚖️ La Regla de Oro de los Índices

Los índices aceleran las lecturas (SELECT), pero ralentizan las escrituras (INSERT, UPDATE, DELETE) porque el motor debe actualizar el árbol de índices en cada modificación. Indexa únicamente columnas utilizadas frecuentemente en WHERE, JOIN y ORDER BY.

Diagnóstico de Rendimiento con EXPLAIN

Anteponiendo EXPLAIN a cualquier consulta, el motor nos explica su plan de ejecución interno: qué índices utilizó, cuántas filas estimó examinar y si realizó escaneos completos:

EXPLAIN SELECT * FROM estudiantes WHERE email = '[email protected]';

Seguridad Crítica: Prevención de Inyección SQL

La inyección SQL (SQL Injection) ocurre cuando se concatenan directamente variables del usuario en una cadena SQL. Un atacante puede introducir comillas y comandos como ' OR '1'='1 para eludir autenticaciones o robar información.

🛡️ Regla de Oro: Siempre usa Sentencias Preparadas (Prepared Statements)

// NUNCA HAGAS ESTO (Vulnerable):
$sql = "SELECT * FROM usuarios WHERE email = '" . $_POST['email'] . "'";

// FORMA SEGURA (PDO Prepared Statements con marcadores con nombre o posicionales):
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE email = :email");
$stmt->execute([':email' => $emailUsuario]);
$usuario = $stmt->fetch();

⚡ Análisis de Plan de Ejecución con EXPLAIN

Inspecciona cómo el motor de base de datos planifica la resolución de una consulta relacional con EXPLAIN QUERY PLAN:

consulta.sql
Solo lectura
-- Analizar el plan de ejecución de una consulta relacional
EXPLAIN QUERY PLAN
SELECT 
    e.nombre,
    c.titulo,
    i.nota
FROM inscripciones i
INNER JOIN estudiantes e ON i.estudiante_id = e.id
INNER JOIN cursos c ON i.curso_id = c.id
WHERE i.nota >= 85.0;
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar Manual Completo de SQL & MySQL y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.