No debería haber ningún problema para mantener y actualizar esta información en MySQL directamente. 3000 visitas por hora significan menos de una consulta por segundo. El uso del motor de almacenamiento InnoDB para esta tabla debería eliminar los problemas de bloqueo. Sin embargo, InnoDB tiene muchas opciones y debe configurarse correctamente para que funcione de manera eficiente; esto es importante.
Sobre la base de sus comentarios creo que la estructura que está buscando sería algo como:
id - page id
type - period length, could be 'day', 'week', 'month'
period - date when period starts, could be integer written as YYYYMMDD or YYYYMM
- depending on the contents of 'type' field
count - hit count for a url over given period
La clave principal sería (type, period, id)
. También índices en (id, period)
y en (type, period, count)
para una eficiente:
SELECT *
FROM ...
WHERE type='week'
and period = 20120409
ORDER BY count DESC
Cuando se crea la página, registros de inserción para cada periodo de conteo = 0. Cuando la página se pone en un éxito, ejecutar una simple actualización:
UPDATE table
SET count = count + 1
WHERE id = $page_id
AND period IN (201204, 20120409)
Actualizaría los tres registros para las estadísticas de "día", "semana" y "mes".
Creo que las transacciones pueden ser buenas. – hjpotter92
¿Es esto para fines analíticos? Si es así, quizás desee considerar el uso de un servicio gratuito como Google Analytics o Jetpack para el seguimiento de las visitas. –
¿Debo considerar utilizar el caché de APC para almacenar en caché primero los datos y luego actualizarlos en la base de datos después de algunas vistas ...? –