La consulta de MySQL 'desaparecer' al ejecutar insertar en la declaración de actualización duplicada con un blob de caracteres 12524

dba.stackexchange https://dba.stackexchange.com/questions/8240

Pregunta

Tengo un inserto mysql en la consulta de actualización como así

insert into table (col1, col2, col3) values (1,2,'huge blob with 12524 chars') on duplicate key update col3 = 'huge blob with 12524 chars';
  • Col1, Col2 es una clave compuesta y tiene un índice.
  • Hay un total de 91 registros en la tabla
  • Todos los demás blobs en la tabla tienen menos de 1000 caracteres
  • Si le doy a Col3 un pequeño valor, entonces esta consulta se ejecuta al instante
  • Si doy un pequeño valor en la parte de inserción, pero un gran valor en la parte de actualización, tarda 5 segundos en ejecutar
  • Si doy un gran valor en la parte de inserción, pero un pequeño valor en la segunda parte, muere con un tiempo de espera de 1 minuto.

¿Qué podría estar causando que esta consulta muera en ejecución después de estar atrapado durante 1 minuto? ¿Qué debo mirar?

¿Qué podría estar causando que esta consulta tarda tanto en ejecutar y morir si el valor de Blob es enorme?

¿Fue útil?

Solución

Esto parece que tienes que aumentar el tamaño de tus paquetes mysql

De acuerdo con la Página 99 de "Comprender MySQL-THERALS" (ISBN 0-596-00957-7), aquí están los párrafos 1-3 que lo explican:

El código de comunicación de red MySQL se escribió bajo el supuesto de que las consultas siempre son razonablemente cortas y, por lo tanto, pueden ser enviadas y procesadas por el servidor en una fragmentación, que se llama paquete En MySQL Terminology. El servidor asigna la memoria para un búfer temporal para almacenar el paquete, y solicita lo suficiente como para ajustarse por completo. Esta arquitectura requiere una precaución para evitar que el servidor se quede sin memoria, una tapa del tamaño del paquete, que esta opción logra.

El código de interés en relación con esta opción se encuentra en sql/net_serv.cc. Echa un vistazo a my_net_read (), luego sigue la llamada a my_real_read () y prestar especial atención a net_realloc ().

Esta variable también limita la longitud de un resultado de muchos funciones de cadena. Ver SQL/Field.cc y sql/intem_strfunc.cc para detalles.

Dado que los paquetes de MySQL pueden contener hileras de datos, los elementos más grandes en el paquete pueden hacer que muchos paquetes filtren de entrada y salida para evitar que se dividan por fragmentos completos de datos relacionados durante el procesamiento. Esto puede ser un asesino silencioso de las conexiones de DB sin razón aparente. De hecho, escribí una publicación sobre cómo esto puede afectar ciertos mysqldumps.

Intente aumentar el max_allowed_packet (256m) usando el siguiente comando:

SET max_allowed_packet = 1024 * 1024 * 256;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top