Cuando te conectas a MySQL, el servidor crea una sesión independiente para tu conexión. Esta sesión tiene su propio conjunto de variables que controlan el comportamiento del servidor específicamente para ti: el tiempo de espera antes de desconectarte, el modo SQL que se aplica, el tamaño máximo de los resultados de GROUP_CONCAT, el formato de las fechas y muchos otros aspectos. Modificar estas variables te permite ajustar el comportamiento de MySQL para tus necesidades sin afectar a otros usuarios conectados.
Qué son las variables de sesión
Las variables de sesión son copias locales de las variables del servidor que cada conexión puede modificar de forma independiente. Cuando una nueva sesión se establece, MySQL copia los valores actuales de las variables globales como valores iniciales para la sesión. A partir de ese momento, cualquier cambio que hagas a una variable de sesión solo afecta a tu conexión.
Esto significa que si cambias wait_timeout en tu sesión a 600 segundos, las demás conexiones mantienen su valor original. Y cuando tu sesión se cierra, todos los cambios se pierden.
Consultar variables de sesión
Para ver el valor actual de una variable de sesión específica, puedes usar cualquiera de estas formas:
-- Usando SHOW VARIABLES
SHOW SESSION VARIABLES LIKE 'wait_timeout';| Variable_name | Value |
|---|---|
| wait_timeout | 28800 |
-- Usando la sintaxis @@session
SELECT @@session.wait_timeout;| @@session.wait_timeout |
|---|
| 28800 |
-- También funciona sin el prefijo session (se asume session por defecto)
SELECT @@wait_timeout;Para buscar variables que contengan un patrón específico:
SHOW SESSION VARIABLES LIKE '%timeout%';| Variable_name | Value |
|---|---|
| connect_timeout | 10 |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| wait_timeout | 28800 |
Para filtrar con mayor precisión, puedes usar WHERE:
SHOW SESSION VARIABLES
WHERE Variable_name LIKE '%max%'
AND Value != '0';Modificar variables de sesión
La sintaxis para cambiar una variable de sesión es:
SET SESSION wait_timeout = 600;O de forma equivalente:
SET @@session.wait_timeout = 600;La palabra SESSION es opcional si no especificas GLOBAL, ya que el ámbito por defecto de SET es la sesión:
SET wait_timeout = 600;Puedes cambiar varias variables en una sola sentencia:
SET SESSION
wait_timeout = 600,
interactive_timeout = 600,
net_read_timeout = 60,
net_write_timeout = 120;Variables de sesión más utilizadas
Hay un conjunto de variables de sesión que los administradores y desarrolladores modifican con frecuencia para resolver necesidades específicas.
sql_mode
El modo SQL controla cómo MySQL valida y procesa los datos. Cambiar el modo SQL de la sesión es habitual cuando trabajas con datos legacy o necesitas un comportamiento específico:
SELECT @@session.sql_mode;| @@session.sql_mode |
|---|
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
-- Desactivar ONLY_FULL_GROUP_BY para una consulta legacy
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,
NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';group_concat_max_len
Por defecto, GROUP_CONCAT() trunca los resultados a 1024 bytes, lo cual es insuficiente en muchos casos reales:
SELECT @@session.group_concat_max_len;| @@session.group_concat_max_len |
|---|
| 1024 |
-- Aumentar para obtener resultados completos
SET SESSION group_concat_max_len = 1000000;wait_timeout e interactive_timeout
Estas variables controlan cuánto tiempo (en segundos) una conexión puede permanecer inactiva antes de que el servidor la cierre automáticamente. wait_timeout aplica a conexiones no interactivas (aplicaciones) e interactive_timeout a conexiones interactivas (cliente mysql):
-- Reducir para liberar conexiones inactivas más rápido
SET SESSION wait_timeout = 300;
SET SESSION interactive_timeout = 300;max_execution_time
Desde MySQL 5.7.8, puedes establecer un tiempo máximo de ejecución para las consultas SELECT de la sesión (en milisegundos):
-- Limitar consultas a 30 segundos
SET SESSION max_execution_time = 30000;Si una consulta SELECT excede este tiempo, MySQL la cancela automáticamente con un error. Esto es útil para proteger el servidor contra consultas accidentalmente lentas.
Caso práctico: sesión de importación masiva
Cuando importas grandes volúmenes de datos, puedes optimizar las variables de sesión para maximizar el rendimiento de la inserción:
-- Guardar valores originales
SET @original_autocommit = @@autocommit;
SET @original_unique_checks = @@unique_checks;
SET @original_foreign_key_checks = @@foreign_key_checks;
-- Configurar sesión para importación rápida
SET SESSION autocommit = 0;
SET SESSION unique_checks = 0;
SET SESSION foreign_key_checks = 0;
SET SESSION sql_log_bin = 0;
-- Realizar la importación
INSERT INTO ventas_historicas (fecha, producto_id, cantidad, total)
SELECT fecha, producto_id, cantidad, total
FROM staging_ventas;
-- ... más inserciones ...
COMMIT;
-- Restaurar valores originales
SET SESSION autocommit = @original_autocommit;
SET SESSION unique_checks = @original_unique_checks;
SET SESSION foreign_key_checks = @original_foreign_key_checks;
SET SESSION sql_log_bin = 1;Desactivar las verificaciones de unicidad y claves foráneas durante una importación masiva reduce drásticamente el tiempo necesario, porque MySQL no tiene que validar cada fila individual contra los índices y las tablas referenciadas. Sin embargo, es responsabilidad del administrador garantizar que los datos importados sean consistentes antes de reactivar las verificaciones.
Caso práctico: depuración de consultas lentas
Cuando necesitas investigar por qué una consulta es lenta, puedes activar el profiling de la sesión para obtener métricas detalladas:
-- Activar profiling en la sesión
SET SESSION profiling = 1;
-- Ejecutar la consulta sospechosa
SELECT c.nombre,
COUNT(p.id) AS total_pedidos,
SUM(p.total) AS gasto_total
FROM clientes c
JOIN pedidos p ON c.id = p.cliente_id
WHERE p.fecha BETWEEN '2025-01-01' AND '2025-03-31'
GROUP BY c.id, c.nombre
HAVING gasto_total > 1000
ORDER BY gasto_total DESC;
-- Ver el perfil de la última consulta
SHOW PROFILE FOR QUERY 1;| Status | Duration |
|---|---|
| starting | 0.000089 |
| checking permissions | 0.000012 |
| Opening tables | 0.000031 |
| init | 0.000045 |
| System lock | 0.000015 |
| optimizing | 0.000028 |
| statistics | 0.000142 |
| preparing | 0.000024 |
| Creating tmp table | 0.000078 |
| Sorting result | 0.000012 |
| executing | 0.245891 |
| Sending data | 0.891234 |
| end | 0.000015 |
| removing tmp table | 0.000067 |
| query end | 0.000011 |
| closing tables | 0.000018 |
| freeing items | 0.000094 |
| cleaning up | 0.000021 |
El perfil muestra que la mayor parte del tiempo se gasta en "Sending data" (0.89 segundos), lo cual indica que el volumen de datos procesados es grande y un índice compuesto podría mejorar el rendimiento.
Otra variable útil para depuración es optimizer_trace, que muestra exactamente cómo el optimizador tomó sus decisiones:
SET SESSION optimizer_trace = 'enabled=on';
-- Ejecutar la consulta
SELECT ...;
-- Ver el trace del optimizador
SELECT * FROM information_schema.OPTIMIZER_TRACE\G
SET SESSION optimizer_trace = 'enabled=off';Las variables de sesión son una herramienta poderosa que permite adaptar MySQL a cada situación específica sin comprometer la configuración general del servidor. En el siguiente artículo veremos las variables globales, que afectan al servidor completo y a todas las conexiones.
Escrito por Eduardo Lázaro
