2011-12-08 11 views
6

Supongamos que tengo una tabla MySQL que mantiene el recuento de visitas de página y quiero hacer un seguimiento del número total de visitas de página para cada usuario. Aquí está el código SQL para incrementar el campo:La forma más rápida de incrementar un campo en la base de datos

UPDATE visits 
    SET visits = visits + 1 
    WHERE user_id = 12 

Es bastante simple, pero me pregunto si hay una manera más rápida para lograr esto. Quiero decir, si tengo muchos visitantes (idealmente millones de usuarios por día), este método es suficiente o debería usar un método alternativo. Gracias.

+0

La manera más rápida es a través de mySQL, que generalmente se está haciendo a través de su consulta actualmente. Cualquier otra alternativa que se me ocurra en la cabeza requeriría extraer los datos, modificarlos con php y luego volver a poner los datos. Lo cual es redundante si todo lo que necesita hacer es incriminar una columna cuando puede hacerlo a través de su consulta. – chris

+0

Quédate con eso. Si tu user_id es una clave primaria (idealmente un auto_increment), estás en el camino correcto. Tendrás declaraciones mucho más lentas de las que tienes que preocuparte cuando pienses en 1 mio. usuarios (sin mencionar las páginas vistas y sus consultas). – Sgoettschkes

Respuesta

3

Con un índice en user_id esto será bastante rápido. Dudo que puedas lograr un resultado (notablemente) más rápido usando cualquier otro medio. Es probable que se encuentre con otros problemas de rendimiento/servidor con millones de usuarios que esta consulta (algunos lo llaman "micro-optimización")

+0

Este tipo de consultas en sitios de alta lectura en realidad puede ser bastante devastador, especialmente en MyISAM ... lanzarlo a un área de almacenamiento secundaria y realizar actualizaciones por lotes ayuda mucho. –

+0

@AdrianSchneider - ¿Qué datos te llevan a esa conclusión (subjetiva)? – nickb

+0

Experiencia personal con sitios de bastante tráfico. Con el bloqueo a nivel de tabla, cada actualización bloquea la tabla por una fracción de segundo. Si esto siempre sucede sin parar, la tabla se bloquea continuamente cada segundo. Es mucho mejor en el bloqueo a nivel de fila, obviamente, pero aún así es algo que me gusta evitar. No es un problema para sitios de poco tráfico. –

0

No creo que esto sea significativo más rápido, pero una cosa que puede hacer es apilar sus visita y actualiza sus clics una vez por minuto por cron. Solo asegúrese de que user_id esté indexado

+1

memcached es una solución completamente incorrecta para esta tarea. –

+0

El único problema con esto es la caché es volátil, por lo que si el par clave/valor se pierde, perderá el recuento de visitas. –

+0

@ Col.Sharapnel: era solo un ejemplo –

0

Con un índice en visits esto podría ser bastante lento.
Aunque te aconsejo que lo dejes como está, hasta que obtengas al menos 10 000 usuarios.
Como tendrá que volver a escribir su código varias veces hasta entonces de todos modos.

+1

Supongamos que tiene 10 000 usuarios. ¿Qué sugieres como solución entonces? –

+1

depende del uso de un número tan inútil. Para empezar, no me molestaría con un contador tan tonto, sino usar un contador de Google o implementar algún analizador de registros. Pero como esperan una solución basada en la base de datos, haré que este campo no esté indexado e implemente un agregador de estadísticas sin conexión para obtener los números. Sin embargo, con 10 mil visitantes por día sigue siendo bastante innecesario. –

+0

Gracias. Bueno, antes que nada, simplifiqué mi necesidad con este código "tonto". En la práctica, no estoy usando este código, solo un ejemplo para este tipo de preguntas. En segundo lugar, ¿podría explicar más sobre el contador de Google? Me gustaría saber más al respecto. Gracias de nuevo. –

Cuestiones relacionadas