2009-07-27 3 views
6

Necesito una manera simple de probar las consultas SQL para la velocidad. No me preocupan las diferencias de hardware, básicamente necesito un número relativo.¿Cómo probar la velocidad de consulta de MySQL, con menos inconsistencias?

Esto es lo que he estado haciendo con PHP (su difusa, pero funciona):

// CONNECT TO DB HERE 

$sub = new YomoSubscription(95,783); 

$t = microtime(TRUE); 

// contains the SQL db call i'm testing 
$fp = $sub->generateFingerprint(); 

echo microtime(TRUE)-$t; 

el problema que estoy teniendo es que, a veces en la conexión inicial/ejecutar mi prueba tarda 1,25 segundos por ejemplo. Sin embargo, en las conexiones subsiguientes se necesitan 0,004 segundos ... ¿Por qué es esto?

Estoy bastante seguro de MySQL caché de consultas está desactivado en my.ini:

query_cache_size=0 

Respuesta

4

Su primera consulta puede ser más lenta porque MySQL está realmente golpeando el disco en la primera consulta, y no en la segunda.

Su sistema operativo puede almacenar en caché los archivos en la memoria a medida que se leen; como resultado, es posible que las lecturas posteriores no necesiten golpear realmente el disco, y regresarán mucho más rápido.

Como regla general, generalmente ejecuto una consulta varias veces y busco consistencia. En la mayoría de los casos, la primera carrera durará varias veces más, mientras que la 2ª 3ª y 4ª tomará la misma cantidad de tiempo. Esas ejecuciones posteriores son probablemente más representativas del tipo de rendimiento que verá en un sistema de producción real, ya que su base de datos de producción debe mantener esos datos en la memoria caché del sistema operativo, mientras que su sistema de desarrollo raramente se accede.

Al final, cuando se trata del rendimiento de las consultas, en su mayor parte, debe darle un pase rápido en desarrollo y supervisar el lento registro de consultas en producción para ver qué consultas realmente necesita .

En lo que respecta a la ejecución programática de consultas para datos de rendimiento, tome varias muestras y utilice la mediana. Pero en la práctica, esto no será terriblemente representativo de los problemas reales de rendimiento con los que se encontrará en producción.

0

Quizás se usando conexiones persistentes en su clase. Un pconnect reutilizará la conexión y sería responsable de este tipo de retraso.

2

Vamos a suponer que:

  1. no utiliza la conexión persistente
  2. la base de datos instalado en el servidor donde se hacen las estadísticas (sin conexión de red)
  3. nadie más está usando la base de datos (fila/table locks)
  4. ningún otro proceso pesado se está ejecutando
  5. etc ....

Si realmente quiere comparar su consulta, lo que tiene que hacer lo siguiente:

$database->query('SET SESSION query_cache_type = OFF'); 

A continuación se ejecuta la consulta de 2-3 veces en un bucle ("calentar" el servidor) .

Y sólo entonces:

$database->query('FLUSH STATUS'); #If you use the stats to profile your query 

$t = microtime(TRUE); 
$fp = $sub->generateFingerprint(); 
echo microtime(TRUE)-$t; 

$database->query('SHOW STATUS'); 

Et voilá !! :)))

Por cierto, la velocidad de consulta es uno de los parámetros de leer. Aprender a leer la información muy valiosa devuelto por SHOW STATUS y EXPLAIN .... Esto va a ser mucho mejor.

Aquí hay un enlace que le encantará: http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/

disfrutar. :)

Cuestiones relacionadas