Home > General > NOTA MENTAL: Apagar el cache antes de optimizar un SELECT en MySQL

NOTA MENTAL: Apagar el cache antes de optimizar un SELECT en MySQL

junio 1, 2009

Ayer estaba tratando de averiguar por qué el sitio web de un amigo producía errores esporádicos como este: Fatal error: Maximum execution time of 30 second exceeded in ...

Estaba sospechando de una petición que se veía muy mal escrita. Era similar a esta:

select *
	from film a
	where a.description in
		(select description 
			from film b 
			where b.description >= a.description)
	order by extract(year from a.last_update),
	extract(month from a.last_update)

Sin embargo, al ejecutarla en el MySQL Query Browser la petición se ejecutaba en 0.06 segundos aproximadamente. ¡Seis centésimas de segundo! WTF?!

Resulta que luego de la primera ejecución MySQL almacena tanto la petición como los resultados en un cache y la próxima vez que alguien ejecuta la misma petición simplemente trae los mismos resultados.

Para deshabilitar el cache para una sola petición y así poder ver cuánto tiempo se está demorando en realidad hay que agregar la opción SQL_NO_CACHE al comienzo del select:

select SQL_NO_CACHE *
	from film a
	where a.description in
		(select description 
			from film b 
			where b.description >= a.description)
	order by extract(year from a.last_update),
	extract(month from a.last_update)

Después de agregar la opción SQL_NO_CACHE la petición se demoraba siempre los mismos 82 segundos (con razón superaba el límite de 30 segundos de PHP). Así pudimos observar cuál era el problema y solucionarlo rápidamente.

Categories: General Tags: ,