Tema SQL
SLEEP() (MySQL / MariaDB)
Pausa la ejecución del hilo durante el número indicado de segundos (con fracción permitida). Pensada para pruebas de bloqueo, timeouts y diagnóstico, no para lógica de negocio.
Descripción
SLEEP(n) devuelve 0 si la espera se completó; en algunos contextos puede interactuar con KILL QUERY o max_execution_time. Es peligrosa en rutas de producción: puede consumir conexiones del pool y bloquear slots innecesariamente. Úsala en scripts de carga controlada, reproducción de deadlocks o demos. No sustituye a colas con delay ni a schedulers en aplicación. Varias herramientas de test la combinan con condiciones para simular latencia. MariaDB/MySQL pueden registrar la consulta como lenta en el slow log.
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.
SLEEP(segundos)
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.
- Solo diagnóstico
- Evita en vistas, triggers y procedimientos llamados por usuarios finales.
- Concurrencia
- Mantiene locks abiertos si se usa dentro de transacción con filas bloqueadas.
- Alternativas
- Retrasos en la capa de aplicación o job schedulers.
Ejemplos
Ejemplo 1
SELECT SLEEP(2);
-- Espera ~2 s; retorna 0
-- Simular respuesta lenta (solo entorno de prueba)
SELECT id FROM pedidos WHERE id = 1 AND SLEEP(0.1) = 0;
Ejemplo 2
-- Secuencia de diagnóstico (no en producción)
SELECT 'inicio' AS paso;
SELECT SLEEP(0.25) AS pausa;
SELECT 'fin' AS paso;
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.