Bueno, sería útil un índice en la columna de marca de tiempo y el ID de usuario. Debe poder leer el resultado de una instrucción EXPLAIN.
Vaya a MySQL y haga lo siguiente:
EXPLAIN SELECT timestamp, username, [a few more] FROM log
WHERE timestamp BETWEEN '2012-03-30 08:00:00' AND '2012-03-30 16:00:00'
AND username='XX'
Esto le muestra el plan que utiliza MySQL para ejecutar la consulta. Habrá una columna llamada clave. Esto indica qué índice está usando MySQL en la consulta. Sospecho que verá TODO allí, lo que significa que MySQL está escaneando la tabla de arriba a abajo haciendo coincidir cada fila con su cláusula where. Ahora cree un índice en las columnas de marca de tiempo y de ID de usuario. Ejecute la sentencia EXPLAIN de nuevo. Debería ver el índice que creó en la columna clave.
Si MySQL usa el índice, su consulta debería ser considerablemente más rápida. Solo recuerda no sobre indexar. Los índices hacen que las inserciones, actualizaciones y eliminaciones sean más lentas. Cuando inserta una nueva fila en una tabla y hay tres índices en la tabla, la nueva fila debe escribir 3 valores en los tres índices diferentes. Así que es un arma de doble filo.