2011-05-23 14 views
16

Estoy trabajando en algún trabajo de optimización, y he notado que en algunos volcados de mysql las personas publican en artículos y preguntas (que no puedo encontrar de nuevo ahora que estoy buscando), hay tiempos de ejecución de alta precisión (0.05985215 segundos en lugar de 0.06 segundos).¿Cómo veo los tiempos de consulta de alta precisión en la línea de comandos de mysql?

¿Cómo puedo ver estos tiempos más precisos para mis consultas en la línea de comandos?

EDITAR

ejemplo de esto es:

+----------+ 
| COUNT(*) | 
+----------+ 
| 11596 | 
+----------+ 
1 row in set (0.05894344 sec) 

el uso de perfiles me pone una parte del camino, pero produce una salida demasiado tiempo, y tengo que recordar a activarlo. Solo estoy buscando una duración simple de alta precisión.

SET profiling = 1; 
<query> 
SHOW PROFILES; 

me da algo como esto:

+----------------------+-----------+ 
| Status    | Duration | 
+----------------------+-----------+ 
| (initialization)  | 0.000005 | 
| checking permissions | 0.00001 | 
| Opening tables  | 0.000499 | 
| Table lock   | 0.000071 | 
| preparing   | 0.000018 | 
| Creating tmp table | 0.00002 | 
| executing   | 0.000006 | 
| Copying to tmp table | 6.565327 | 
| Sorting result  | 0.000431 | 
| Sending data   | 0.006204 | 
| query end   | 0.000007 | 
| freeing items  | 0.000028 | 
| closing tables  | 0.000015 | 
| logging slow query | 0.000005 | 
+----------------------+-----------+ 
14 rows in set (0.00 sec) 
+0

mente para publicar enlaces a los _articles y preguntas que contienen los tiempos de ejecución de alta precisión (0,05985215 segundos en lugar de 0,06 seg) _? parece que no puedo encontrar ninguno. Supongo que la manera más rápida de responder a tu pregunta es simplemente preguntando al cartel de esos artículos y pregunta cómo lo hicieron. –

+1

La verdadera pregunta es si es compatible con el servidor.La generación de perfiles le mostrará el tiempo de CPU que tomó para cada paso, sin incluir ** consultas simultáneas ** ejecutándose al mismo tiempo. Entonces, debemos verificar si aún tenemos ** getrusage ** sin perfiles. – vbence

Respuesta

12

Parece que la mejor respuesta a esto es habilitar el perfilado. No ha habido otras pistas que funcionen.

Mejor respuesta, use perfiles de consultas.

SET profiling = 1; 
<query> 
SHOW PROFILES; 
0

Sin ver los vertederos que estamos hablando, es probable que sea una función definida por el usuario? Vea este hilo (http://lists.mysql.com/internals/33707) para obtener un par de consejos y cómo hacerlo.

+0

Pero eso solo le indicará cuánto tiempo tardó en regresar la llamada. Justo lo mismo que usted guardó el microtiempo antes y después de la consulta en el programa. - En otras palabras, si una consulta lenta se ejecuta en un hilo diferente, también aumentará el tiempo de ejecución de su consulta. - Una solución real tiene que estar ** basada en getrusage() **, solo para contar el tiempo de CPU gastado en su hilo (ejecutando su consulta). – vbence

10

esta pregunta se responde mejor mirando el source of the mysql command line client. la relevant piece of code,

static void nice_time(double sec,char *buff,bool part_second) 
{ 
    // ... 
    if (part_second) 
    sprintf(buff,"%.2f sec",sec); 
    else 
    sprintf(buff,"%d sec",(int) sec); 
} 

tiene el número de dígitos después de la coma decimal del sec valor codificado en(). esto me haría concluir que los tiempos de mayor precisión son no posible con una instalación de stock mysql.

por supuesto, puede parchar este código, hacerlo configurable, etc., y install from source. Supongo que esto es lo que las personas en los artículos y las preguntas que usted ha mencionado están haciendo. su mejor oportunidad de averiguarlo es simplemente preguntarles (vea mi comentario a su pregunta).

+0

@ax Aparentemente solo sé lo suficiente como para resolver la primera parte de esto. Logré aumentar el número de dígitos significativos, pero creo que el resultado se trunca en otro lugar antes de que se ingrese aquí. –

+0

@Ben Dauphinee ¿le preguntaste a los tipos que usan los tiempos de alta precisión cómo lo hicieron? eso debería ser más fácil que tratar de parchearlo :) –

+0

@ax He publicado un hilo en los foros de MySQL para preguntar si se puede hacer esto o cómo. Estaré publicando en forma cruzada los resultados cuando los obtenga, y aceptando tu respuesta b/c lo conducen en esa dirección. –

0

No es elegante, pero la solución de trabajo es parchear /usr/bin/mysql:

# copy the original mysql binary to your home dir 
cp /usr/bin/mysql ~/mysql 
# patch it 
sed -i -e 's/%.2f sec/%.8f sec/1' ~/mysql 
# run it from the home directory 
~/mysql 

Funciona porque en la actualidad sólo hay una cadena de formato '% .2f seg' en el binario de MySQL, pero se puede cambiar a través del tiempo. Es posible volver al binario original de aplicar el parche inversa:

sed -i -e 's/%.8f sec/%.2f sec/1' ~/mysql 
+1

Para mí esto es imprimir resultados como "2 filas en el conjunto (0.00000000 seg)". Pero el MOSTRAR PERFILES dice que demora alrededor de un milisegundo. Así que sospecho que la fuente de datos que alimenta esto no es lo suficientemente alta como para que esto realmente ayude. –

Cuestiones relacionadas