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_nameValue
wait_timeout28800
-- 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_nameValue
connect_timeout10
interactive_timeout28800
lock_wait_timeout31536000
net_read_timeout30
net_write_timeout60
wait_timeout28800

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;
StatusDuration
starting0.000089
checking permissions0.000012
Opening tables0.000031
init0.000045
System lock0.000015
optimizing0.000028
statistics0.000142
preparing0.000024
Creating tmp table0.000078
Sorting result0.000012
executing0.245891
Sending data0.891234
end0.000015
removing tmp table0.000067
query end0.000011
closing tables0.000018
freeing items0.000094
cleaning up0.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