Tema SQL
BENCHMARK() (MySQL / MariaDB)
Ejecuta una expresión un número fijo de veces y mide tiempo de CPU del servidor para microbenchmarks en SQL. No sustituye a benchmarks de aplicación ni a EXPLAIN ANALYZE.
Descripción
BENCHMARK(iteraciones, expresión) evalúa expresión muchas veces en el servidor; el valor devuelto suele ser 0 y el «resultado» es el tiempo transcurrido implícito (no es un perfilador detallado). Sirve para comparar variantes de funciones puras (p. ej. MD5 vs SHA2) en la misma máquina y versión. No incluye I/O ni red; el optimizador puede simplificar expresiones constantes. Úsala con criterio en servidores compartidos: iteraciones altas cargan CPU. Para consultas reales usa EXPLAIN, performance_schema y trazas de aplicación.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
BENCHMARK(n, expresión)
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Microbench
- Compara coste relativo de expresiones, no latencia end-to-end.
- Carga
- n millones puede saturar un core; reduce en entornos compartidos.
- Optimizador
- Expresiones constantes pueden evaluarse una sola vez; usar expresiones no constantes para medir.
Ejemplos
Ejemplo 1
SELECT BENCHMARK(1000000, MD5('test'));
SELECT BENCHMARK(500000, (SELECT COUNT(*) FROM pedidos WHERE estado = 'pendiente'));
Ejemplo 2
SELECT BENCHMARK(50000, (SELECT COUNT(*) FROM lineas_pedido lp
INNER JOIN pedidos p ON p.id = lp.pedido_id));
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.