2010-06-25 15 views
5

Hemos tenido algunos problemas con nuestro servidor MySQL de manera intermitente. Sigue arrojando muchas de estas consultas al mismo tiempo (por lo tanto, apilándolas en mi lista de procesos). Estamos utilizando un db MyISAM y una agrupación de conexiones a través de Glassfish v3 para una aplicación de Grails.¿Por qué sigo recibiendo la conversión de HEAP a MyISAM en mi servidor mysql?

usuario_bd myhost: 35143 db consulta 39

converting HEAP to MyISAM /* mysql-connector-java-5.1.7 (Revision:) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'init_connect' 

Especulamos que hay tablas temporales que se crean a través de los griales GORM (ORM) que están causando estas consultas. ¿Por qué sigo recibiendo la conversión de HEAP a MyISAM en mi servidor mysql?

Respuesta

6

Sobre el mensaje converting HEAP to MyISAM, la siguiente answer escribe:

Esto sucede cuando las tablas temporales creadas por MySQL en los pasos intermedios del procesamiento de consultas crecen demasiado grande para ser almacenado en la memoria. Por lo que sé, al hacer esto, MySQL escribe tablas temporales de MyISAM independientemente del motor de base de datos que utilice (solo una tabla temporal que se eliminará al final de la consulta). No es un problema, excepto por el tiempo que dura el proceso.

La solución más simple es aumentar tmp_table_size, puede ser temporalmente si está realizando trabajos de mantenimiento. Si esto no es suficiente, divide en fragmentos tu consulta usando LIMIT y OFFSET y aumenta el OFFSET para cubrir toda la tabla que leas en tu consulta. Si está leyendo varias tablas grandes en la consulta y necesita limitar cada una de ellas, no olvide abarcar todas las combinaciones de las tablas: p. si usa DOS tablas y desea dividir cada una en TRES partes, necesitará repetir la consulta OFFSET-ted SEIS veces con las diferentes combinaciones de valores crecientes de OFFSET. Un archivo por lotes vendrá a mano para facilitar todo esto.

Así que MySQL está creando estas tablas en memoria (y potencialmente las convierte en tablas temporales MyISAM), no Grails. Pero tengo entendido que pueden ser el resultado de consultas demasiado pesadas.

+0

Agregar: El bit que comienza con el comentario sale de Connector-J cuando se establece una nueva conexión. (Está en com.mysql.jdbc.ConnectionImpl # loadServerVariables si desea verlo). Si está viendo muchas de ellas, verificaría que la agrupación de conexiones funciona como espera y que su MySQL está configurado para una cantidad adecuada de conexiones. –

+0

Todavía llevo este mensaje cuando ejecuto una consulta heacy en una tabla que es MyISAM. Entonces, ¿de dónde viene el montón? – chiliNUT

Cuestiones relacionadas