2011-11-27 81 views
11

He acaba de encender slow query logging en mi base de datos MySQL, añadiendo lo siguiente a /etc/mysql/my.cnf:¿Qué significa "SELECT/*! N SQL_NO_CACHE */* FROM` mytable` "en el registro lento de consultas de MySQL?

log_slow_queries = /var/log/mysql/mysql-slow.log 
long_query_time = 1 

Cuando corro mysqldumpslow, emite la siguiente:

Reading mysql slow query log from mysql-slow.log 
Count: 1 Time=199.23s (199s) Lock=0.00s (0s) Rows=32513.0 (32513), ... 
SELECT /*!N SQL_NO_CACHE */ * FROM `mytable` 

... 

Mirando el original mysql-slow.log, la consulta completa fue:

SELECT /*!40001 SQL_NO_CACHE */ * FROM `mytable`; 

Así que mysqldumpslow acaba de reemplazar el número con N (para ayudar a agregar consultas similares.)

Entonces, la pregunta es, ¿de dónde viene esa consulta y qué significa el bit /*!40001 SQL_NO_CACHE */?

Lo mejor que puedo decir, es probablemente de un comando mysqldump que estaba haciendo una copia de seguridad (por lo tanto, no quiero datos en caché), ¿te parece correcto? Y si es así, dado que solo leyó 32,000 filas, ¿por qué tomó 199?

Hay muchas más consultas similares en otras tablas que toman 100s, 50s, hasta 3s más razonables, la mayoría tienen alrededor de 10-20,000 filas, la más grande con 450,000 filas.

+0

¿Tal vez podría aceptar la mejor respuesta a continuación? – rubo77

Respuesta

4

La consulta es probablemente 'lenta' porque el cliente (su sistema de copia de seguridad) tiene que leer cada fila en su tabla; que está tomando aparentemente 199 segundos.

Tenga en cuenta que si se hizo algo como:

SELECT * FROM table LIMIT 100; 

// read 50 rows 

// sleep for 5 minutes 

// read last 50 rows 

La consulta anterior aparecería en el lento registro, porque a partir de cuando empezó, a cuando podría terminar (con el envío de la última fila solicitada) tomó 5 minutos.

+1

Pero el "sistema de respaldo" es mysqldump, seguramente eso no lleva 200 segundos para escribir 32,000 filas? – Tom

+2

En realidad, si está enviando eso a través de ssh (a través de gzip) podría mantenerlo abierto hasta que todos los datos se hayan transferido ... – Tom

+0

Realice una LISTA DE PROCESO MUESTRA cuando la consulta se esté ejecutando, si su estado es 'escritura en la red' (I piense) entonces está enviando los datos tan rápido como su otro extremo lo está procesando. – Andrew

22

El /*!40001 SQL_NO_CACHE */ significa que en versiones de mysql> = 4.0.1 ejecute SELECT SQL_NO_CACHE * FROM mytable y en versiones anteriores ejecute el comando sin el SQL_NO_CACHE.

También mysqldump utiliza la sintaxis /*!40001 SQL_NO_CACHE */.

No estoy seguro de por qué tus consultas serían tan lentas.

+0

¡Ah, un número de versión! Pensé que podría haber sido un código de error o algo así. Eso es bueno saber, ¿hay alguna documentación para esa sintaxis? – Tom

+0

Sí, puede encontrar información sobre el sitio MySQL en: http://dev.mysql.com/doc/refman/5.1/en/comments.html –

+0

Esta debería ser la respuesta correcta. No creo que la pregunta principal fuera: "¿Por qué mis consultas son lentas?" Al menos no en el título –

3

Una cuestión de ajuste puede ser considerada por usted para hacer que esta consulta se ejecute más rápido de lo que, por cierto, SQL_NO_CACHE significa que esta consulta se ejecutará sin ser elegible para ser almacenada en el caché de consultas. Por ejemplo, puede usar esta AVISO, SQL_NO_CACHE, para evitar que esta consulta se guarde en la memoria caché para probar ese tiempo de ejecución.

Hay que ver: http://dev.mysql.com/doc/refman/5.0/en/query-cache-in-select.html

Más sugerencias para utilizar en consultas: http://www.petefreitag.com/item/613.cfm

Cheers, WB

-1

de mi trabajo, también se enfrentó al mismo problema Luego probé en dos formas de resolver eso.

En primer lugar, tengo aumentar el tamaño mysql_query_cache y aumentar el espacio en la máquina local.

En segundo lugar, he comprobado el tamaño del servidor remoto mysql_query_cache y aumento el espacio de directorio temporal.

Porque, lo que obtuve de la investigación de que este sistema está funcionando en ambos sentidos y nos da la sensación de que tenemos que aumentar el espacio en el lugar específico.

Por lo tanto, sea específico que esté usando mysqldum p y revise la versión también para ambos sistemas. Como versión diferente también se comportan levemente diferente.

+2

¿No veo cómo responde esto a la pregunta? – Carpetsmoker

+0

Recibí el mismo error y lo resolví en esos pasos. Quiero decir que no está relacionado con el registro lento de consultas. Se trata del tamaño del espacio en el sistema. Así es como la respuesta está relacionada con la pregunta. – Sumsun

+1

Pero esta pregunta no es sobre un error, ¿pero pedir una explicación sobre lo que significa algo? – Carpetsmoker

Cuestiones relacionadas